2016-07-31 57 views
2

我已經從STATA過渡到R,我正在試驗不同的數據類型,以便R的數據結構在我的腦海中清晰。索引在R的嵌套列表結構

下面是我如何設置我的數據結構:

b<-list(u=5,v=12) 
c<-list(u=7) 
j<-list(name="Joe",salary=55000,union=T) 
bcj<-list(b,c,j) 

現在,我試圖找出不同的方式來訪問U = 5。我相信,有三種方式:

Try1:

bcj[[1]][[1]] 

我5.正確的!

Try2:

bcj[[1]][["u"]] 

我5.正確的!

Try3:

bcj[[1]]$u 

我5.正確的!

Try4

bcj[[1]][1][1] 

這裏就是我的了:

bcj[[1]][1][1] 
$u 
[1] 5 

class(bcj[[1]][1][1]) 
[1] "list" 

問題1:爲什麼會出現這種情況?

另外,我嘗試了以下內容:

bcj[[1]][1][1][1][1][1] 
$u 
[1] 5 

class(bcj[[1]][1][1][1][1][1]) 
[1] "list" 

問題2:我本來期望一個錯誤,因爲我不認爲存在BCJ這麼多的名單,但[R給了我一個清單。爲什麼發生這種情況?

PS:我的確在看SO this thread,但它談論的是另一個問題。

回答

2

我認爲這足以回答你的問題。考慮一個長度爲1的列表

x <- list(u = 5) 
#$u 
#[1] 5 
length(x) 
#[1] 1 

x[1] 
x[1][1] 
x[1][1][1] 
... 

總是給你相同的:

#$u 
#[1] 5 

換句話說,x[1]將是相同的x,你陷入無限遞歸。無論你寫多少條[1],你自己都會得到x

如果我創建了t1<-list(u=5,v=7),然後再做t1[2][1][1][1] ...這也適用。然而,t1[[2]][2]NA


編制索引列表時,是[[[之間的差異。使用[將始終以列表結尾,而[[將取出內容。比較:

z1 <- t1[2] 
## this is a length-1 list 
#$v 
#[1] 7 
class(z1) 
# "list" 

z2 <- t1[[2]] 
## this takes out the content; in this case, a vector 
#[1] 7 
class(z2) 
#[1] "numeric" 

當你這樣做z1[1][1]...,如上所述,你總是z1本身告終。雖然如果你做z2[2],你當然會得到一個NA,因爲z2只有一個元素,你要求的第二個元素。


也許這篇文章,我的答案有你有用:Extract nested list elements using bracketed numbers and names

+1

謝謝這個。這有助於。有趣的是,如果我創建t1 <-list(u = 5,v = 7),然後執行t1 [2] [1] [1] [1] ...這也可以。但是,t1 [[2]] [2]給出了NA .. – watchtower

+2

這是一種正常行爲。 R中的基本單位是一個向量。 't1 [2]'返回一個向量(長度爲1)。 't1 [2] [1]'返回該向量中的第一個條目,這是一個數字,但從某種意義上說,它也是一個長度爲1的向量,這可以繼續。至於't1 [[2]] [2]',你需要一個不存在的元素,所以不需要錯誤信息。 –

+1

Zheyuan和p_barill,感謝您的精彩評論。我知道你已經回答了我的問題,但是當我想到這個問題時,我有一個快速問題。在t1的例子中(即t1 <-list(u = 5,v = 7)),長度(t1)是2,這是有意義的。此外,長度(t1 [1])爲1,這也是有意義的,因爲只有一個列表。但是,有什麼方法可以使長度(t1 [1])大於1?我不太清楚,所以我想問你們。我會很感激你的想法。抱歉來回。 – watchtower