【问题标题】:Indexing nested list structure in RR中的索引嵌套列表结构
【发布时间】:2016-07-31 21:53:11
【问题描述】:

我已经从 STATA 过渡到 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 的不同方法。我认为有三种方式:

试一试:

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,但它谈论的是不同的问题。

【问题讨论】:

    标签: r list reference


    【解决方案1】:

    我认为这足以回答您的问题。考虑一个length-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&lt;-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?

    【讨论】:

    • 谢谢哲元。这有帮助。有趣的是,如果我创建 t1
    • 这是正常现象。 R中的基本单位是向量。 t1[2] 返回一个向量(长度为 1)。 t1[2][1] 返回该向量中的第一个条目,这是一个数字,但从某种意义上说,它也是一个长度为 1 的向量,并且可以继续下去。至于t1[[2]][2],你要求的是一个不存在的元素,所以 NA 而不是错误信息。
    • 哲元和p_barill,感谢出色的cmets。我知道您已经回答了我的问题,但是当我想到这一点时,我有一个简短的问题。在 t1 示例中(即 t1
    • 谢谢哲元。我想我很想知道我们是否可以构造一个列表(或数据框),使得嵌套列表中“第一个”列表的长度大于 1。对于我的问题不清楚,我深表歉意。在我浏览过 Norman Matloff 的书的所有示例中,长度似乎都是 1。即使在我上面的 bcj 示例中,bcj[1]、bcj[2] 和 bcj[3] 的长度也是 1。
    • 太棒了!完美的!你太棒了。我希望我能给你5000分!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2013-05-12
    • 2019-01-05
    • 1970-01-01
    • 2020-05-08
    相关资源
    最近更新 更多