索引即提取/查询数据集中想要的数据,与Python类似,R语言提供位置索引与名称索引两种索引体系。由于数据索引是基于数据容器,因此建议先阅读R语言数据类型与数据容器,再阅读本篇。
本人的知乎|简书|CSDN|微信公众号PurePlay 会同步更新量化金融与R干货。

目录

1. 位置索引
  1.1 正整数
  1.2 负整数
  1.3 零
  1.4 空格
  1.5 逻辑值
2. 名称索引

1. 位置索引

R语言的索引方式类似于线性代数中的 i , j i, j i,j记号,df[i, j]会返回df数据框中的第 i i i行第 j j j列元素。除了在括号中传入正整数之外,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干货。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐