R語(yǔ)言 | 數(shù)據(jù)索引

索引即提取/查詢數(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ù)中的i, j記號(hào),df[i, j]會(huì)返回df數(shù)據(jù)框中的第i行第j列元素。除了在括號(hào)中傳入正整數(shù)之外,R語(yǔ)言還可以傳入負(fù)整數(shù)、零、空格和邏輯值來進(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開始的,這意味著索引值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干貨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容