【问题标题】:Extract column from list which is made up of lists从由列表组成的列表中提取列
【发布时间】:2016-03-24 22:17:42
【问题描述】:

a 是一个包含列表的列表:

a<-list(list(matrix(c(0,0,0,1,2,1,2,2,2,1,1,1),3),
             matrix(c(0,0,1,2,2,2,2,1),2)),
        list(matrix(c(0,0,1,2,2,1,1,1,2,2,2,2),3)))

> a
[[1]]
[[1]][[1]]
     [,1] [,2] [,3] [,4]
[1,]    0    1    2    1
[2,]    0    2    2    1
[3,]    0    1    2    1

[[1]][[2]]
     [,1] [,2] [,3] [,4]
[1,]    0    1    2    2
[2,]    0    2    2    1


[[2]]
[[2]][[1]]
     [,1] [,2] [,3] [,4]
[1,]    0    2    1    2
[2,]    0    2    1    2
[3,]    1    1    2    2

我想提取所有对象的第一列。我们知道如果列表是由矩阵组成的,我们可以使用“映射”函数来解决这个问题,但是现在列表是由列表组成的,我们不能只使用“映射”来解决这个问题,我该怎么办这么容易?

我使用以下代码来解决这个问题:

sapply(1:length(a), function(x) {Map(function(y) y[,1],a[[x]])})

可以解决,但是不知道有没有更方便的方法来解决这个问题,因为我以后需要根据这个问题做更多的工作。谢谢!

【问题讨论】:

  • @rawr 你让我遇到了“rapply”,谢谢!
  • @rawr - 这应该是真正的答案 - 它是通用且可扩展的

标签: r list matrix


【解决方案1】:

我认为以下工作:

sapply(unlist(a, recursive = FALSE), function(x) x[ , 1])

# [[1]]
# [1] 0 0 0
# 
# [[2]]
# [1] 0 0
# 
# [[3]]
# [1] 0 0 1

如果a 上的嵌套超出了一层,这将不起作用。

感谢@rawr 的解决方案,该解决方案允许我们使用rapply 保留原始list 结构,请参阅?rapply 了解更多信息:

rapply(a, function(x) x[,1], how = "list")
# [[1]]
# [[1]][[1]]
# [1] 0 0 0
# 
# [[1]][[2]]
# [1] 0 0
#
#
# [[2]]
# [[2]][[1]]
# [1] 0 0 1

【讨论】:

  • unlist(a, recursive = FALSE) 太棒了!虽然结果不在列表结构中,但是这段代码很精彩!我试过 unlist (a),只得到了一系列数字。 “recursive = FALSE”很有帮助!非常感谢!
【解决方案2】:

同样,我认为另一种解决方案可能是嵌套的 lapply 函数。不过,这里的事情可能会变得非常棘手。

代码是:

lapply(a, function(x) lapply(x, 
                      function(x) x[,1]))

我们实际上是在列表中下降两层(通过调用 lapply 两次)然后提取第一列(使用 x[,1])。

结果是:

[[1]]
[[1]][[1]]
[1] 0 0 0

[[1]][[2]]
[1] 0 0

[[2]]
[[2]][[1]]
[1] 0 0 1

请注意,这也要求我们知道我们的列表只扩展了两个级别。

【讨论】:

    猜你喜欢
    • 2022-12-10
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多