2016-07-31 33 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