索引即提取/查询数据集中想要的数据,与Python类似,R语言提供位置索引与名称索引两种索引体系。由于数据索引是基于数据容器,因此建议先阅读R语言数据类型与数据容器,再阅读本篇。
本人的知乎|简书|CSDN|微信公众号PurePlay
会同步更新量化金融与R干货。
目录
1. 位置索引
1.1 正整数
1.2 负整数
1.3 零
1.4 空格
1.5 逻辑值
2. 名称索引
1. 位置索引
R语言的索引方式类似于线性代数中的记号,df[i, j]
会返回df数据框中的第行第列元素。除了在括号中传入正整数之外,R语言还可以传入负整数、零、空格和逻辑值来进行索引。
1.1 正整数
首先创建一个简单的数据框:
df <- data.frame(price = c(89.2, 23.2, 21.2),
symbol = c('MOT','AAPL','IBM'),
action = c('Buy','Sell','Buy'),
stringsAsFactors = FALSE)
df
## price symbol action
## 1 89.2 MOT Buy
## 2 23.2 AAPL Sell
## 3 21.2 IBM Buy
提取df数据框第2行第3列的元素:
df[2,3]
## [1] "Sell"
注意到在Python等编程语言中,索引是从0开始的,这意味着索引值0会返回第一个元素,而1会返回第二个元素,以此类推。而在R作为一门为数据科学、统计学者服务的语言,则与线性代数保持一致,索引值1返回第一个元素。
提取df数据框第2行的第2列与第3列两个元素:
df[2,c(2,3)]
## symbol action
## 2 AAPL Sell
如果在索引中重复某个数值,R就会在相应的索引位置重复提取相应的数据。
df[c(2,2),c(2,3)]
## symbol action
## 2 AAPL Sell
## 2.1 AAPL Sell
其他数据容器的位置索引方式与之类似,只要在中括号中传入对应维度的数值即可。
如果提取两列及以上的数据,返回值的格式为data.frame
。
class(df[2, 2:3])
## [1] "data.frame"
如果只提取一列数据,R则会返回一个原子型向量;如果仍想返回一个数据框,可以在括号内添加drop = FALSE
参数。
class(df[2:3, 2])
## [1] "character"
class(df[2:3, 2, drop = FALSE])
## [1] "data.frame"
1.2 负整数
与正整数相反,负整数索引把负整数绝对值(正整数)对应的元素排除在外,返回剩下的所有元素。如果需要选取数据集中的大部分行或列,使用负整数索引会更加高效。
返回除了第一行之外的所有元素:
df[-1, 1:3]
## price symbol action
## 2 23.2 AAPL Sell
## 3 21.2 IBM Buy
仅返回第一行的元素;
df[-(2:3), 1:3]
## price symbol action
## 1 89.2 MOT Buy
如果在一个相同的索引位置同时使用正整数和负整数,R便会报错。
df[c(-1,1), 1:3]
## Error in xj[i] : only 0's may be mixed with negative subscripts
1.3 零
零索引将不会提取任何信息,实际操作中用处不大。
df[0,0]
## data frame with 0 columns and 0 rows
df[0,1]
## numeric(0)
1.4 空格
空格表示提取该索引位置所代表维度的所有元素。例如,提取第一行的所有元素:
df[1, ]
## price symbol action
## 1 89.2 MOT Buy
1.5 逻辑值
在逻辑值索引时,R会匹配索引值为TRUE的行或列的位置并提取相应的元素。例如,提取第1行的第二、三个元素:
df[1,c(FALSE, TRUE, TRUE)]
## symbol action
## 1 MOT Buy
另外,在列表的索引中,如果采用单中括号的常规方式会返回一个新的列表对象(即使你只需要一个元素)。
ls <- list(numbers = c(1,2),
logical = TRUE,
string = c("a", "b", "c"))
ls[1]
## $numbers
## [1] 1 2
class(ls[1])
## [1] "list"
为了直接提取出该元素,需要使用双中括号。
ls[[1]]
## [1] 1 2
2. 名称索引
如果被索引的对象有名称属性,就可以采用待提取元素的名称作为索引值。例如,提取整个price列:
df[ ,"price"]
## [1] 89.2 23.2 21.2
使用$
使名称索引更加简便:
df$price
## [1] 89.2 23.2 21.2
且在列表当中使用$
可以直接返回对应的元素,而不是列表对象:
ls$numbers
## [1] 1 2
以上是本篇的全部内容,欢迎关注我的知乎|简书|CSDN|微信公众号PurePlay
, 会不定期分享量化金融与R干货。