索引即提取/查詢數(shù)據(jù)集中想要的數(shù)據(jù)钾军,與Python類似樱哼,R語(yǔ)言提供位置索引與名稱索引兩種索引體系砸讳。由于數(shù)據(jù)索引是基于數(shù)據(jù)容器挽荠,因此建議先閱讀R語(yǔ)言數(shù)據(jù)類型與數(shù)據(jù)容器,再閱讀本篇算墨。
本人的知乎|簡(jiǎn)書|CSDN|微信公眾號(hào)PurePlay
會(huì)同步更新量化金融與R干貨少孝。
目錄
1. 位置索引
??1.1 正整數(shù)
??1.2 負(fù)整數(shù)
??1.3 零
??1.4 空格
??1.5 邏輯值
2. 名稱索引
1. 位置索引
R語(yǔ)言的索引方式類似于線性代數(shù)中的記號(hào),
df[i, j]
會(huì)返回df數(shù)據(jù)框中的第行第
列元素熬苍。除了在括號(hào)中傳入正整數(shù)之外稍走,R語(yǔ)言還可以傳入負(fù)整數(shù)、零柴底、空格和邏輯值來(lái)進(jìn)行索引婿脸。
1.1 正整數(shù)
首先創(chuàng)建一個(gè)簡(jiǎn)單的數(shù)據(jù)框:
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數(shù)據(jù)框第2行第3列的元素:
df[2,3]
## [1] "Sell"
注意到在Python等編程語(yǔ)言中,索引是從0開(kāi)始的柄驻,這意味著索引值0會(huì)返回第一個(gè)元素狐树,而1會(huì)返回第二個(gè)元素,以此類推鸿脓。而在R作為一門為數(shù)據(jù)科學(xué)抑钟、統(tǒng)計(jì)學(xué)者服務(wù)的語(yǔ)言,則與線性代數(shù)保持一致野哭,索引值1返回第一個(gè)元素在塔。
提取df數(shù)據(jù)框第2行的第2列與第3列兩個(gè)元素:
df[2,c(2,3)]
## symbol action
## 2 AAPL Sell
如果在索引中重復(fù)某個(gè)數(shù)值,R就會(huì)在相應(yīng)的索引位置重復(fù)提取相應(yīng)的數(shù)據(jù)拨黔。
df[c(2,2),c(2,3)]
## symbol action
## 2 AAPL Sell
## 2.1 AAPL Sell
其他數(shù)據(jù)容器的位置索引方式與之類似蛔溃,只要在中括號(hào)中傳入對(duì)應(yīng)維度的數(shù)值即可。
如果提取兩列及以上的數(shù)據(jù)篱蝇,返回值的格式為data.frame
贺待。
class(df[2, 2:3])
## [1] "data.frame"
如果只提取一列數(shù)據(jù),R則會(huì)返回一個(gè)原子型向量态兴;如果仍想返回一個(gè)數(shù)據(jù)框狠持,可以在括號(hào)內(nèi)添加drop = FALSE
參數(shù)。
class(df[2:3, 2])
## [1] "character"
class(df[2:3, 2, drop = FALSE])
## [1] "data.frame"
1.2 負(fù)整數(shù)
與正整數(shù)相反瞻润,負(fù)整數(shù)索引把負(fù)整數(shù)絕對(duì)值(正整數(shù))對(duì)應(yīng)的元素排除在外喘垂,返回剩下的所有元素。如果需要選取數(shù)據(jù)集中的大部分行或列绍撞,使用負(fù)整數(shù)索引會(huì)更加高效正勒。
返回除了第一行之外的所有元素:
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
如果在一個(gè)相同的索引位置同時(shí)使用正整數(shù)和負(fù)整數(shù),R便會(huì)報(bào)錯(cuò)傻铣。
df[c(-1,1), 1:3]
## Error in xj[i] : only 0's may be mixed with negative subscripts
1.3 零
零索引將不會(huì)提取任何信息章贞,實(shí)際操作中用處不大。
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 邏輯值
在邏輯值索引時(shí)蜕径,R會(huì)匹配索引值為TRUE的行或列的位置并提取相應(yīng)的元素。例如败京,提取第1行的第二兜喻、三個(gè)元素:
df[1,c(FALSE, TRUE, TRUE)]
## symbol action
## 1 MOT Buy
另外,在列表的索引中赡麦,如果采用單中括號(hào)的常規(guī)方式會(huì)返回一個(gè)新的列表對(duì)象(即使你只需要一個(gè)元素)朴皆。
ls <- list(numbers = c(1,2),
logical = TRUE,
string = c("a", "b", "c"))
ls[1]
## $numbers
## [1] 1 2
class(ls[1])
## [1] "list"
為了直接提取出該元素,需要使用雙中括號(hào)泛粹。
ls[[1]]
## [1] 1 2
2. 名稱索引
如果被索引的對(duì)象有名稱屬性遂铡,就可以采用待提取元素的名稱作為索引值。例如晶姊,提取整個(gè)price列:
df[ ,"price"]
## [1] 89.2 23.2 21.2
使用$
使名稱索引更加簡(jiǎn)便:
df$price
## [1] 89.2 23.2 21.2
且在列表當(dāng)中使用$
可以直接返回對(duì)應(yīng)的元素扒接,而不是列表對(duì)象:
ls$numbers
## [1] 1 2
以上是本篇的全部?jī)?nèi)容,歡迎關(guān)注我的知乎|簡(jiǎn)書|CSDN|微信公眾號(hào)PurePlay
, 會(huì)不定期分享量化金融與R干貨帽借。