在R中创建列表列表时出现问题

时间:2013-07-10 14:32:39

标签: r list append subset nested-lists

我一直在尝试在R中创建列表列表。我首先创建一个预定长度列表。然后我使用for循环遍历矩阵来填充列表。

问题是我似乎得到了列表等列表。

我的代码:

potential_dups <- rep(list(list()), 10)
nearest10 <- matrix(rnorm(100), nrow=10)

for (i in 1:length(nearest10[ , 1])) {
  for (j in 1:10) {
    if (nearest10[i, j] < 0.35 && nearest10[i, j] > 0) {
      potential_dups[[i]] <- append(potential_dups[[i]], nearest10[i, j])
    }
  } 
}  

为什么会这样?如何创建此格式的列表?

[[1]]
[1] "Element 1A"
[[1]]
[2] "Element 1B"
[[1]]
[3] "Element 1C"

[[2]]
[1] "Element 2A"
[[2]]
[2] "Element 2B"

此外,我最终会显示空列表,例如显示为:     [[3]]     名单() 第一个元素是NULL。我还想编写脚本,只从该数据结构中排除非空列表。

2 个答案:

答案 0 :(得分:1)

尽管你的例子不可复制,我得到一个列表列表,其中包含以下类似的代码:

potential_dups <- rep(list(list()), 10)
nearest10 <- matrix(rnorm(100), nrow=10)
for (i in 1:10) {
  for (j in 1:10) {
    if (nearest10[i, j] < 0.35 & nearest10[i, j] > 0) {
      potential_dups[[i]] <- append(potential_dups[[i]], nearest10[i, j])
    }
  } 
}  

要删除空列表,您可以执行以下操作:

potential_dups[sapply(potential_dups, function(x) length(x) > 0)]

答案 1 :(得分:0)

这是一种更好的(更好的可读性和更高效)方式:

mat <- nearest10
mat[mat >= 0.35 | mat <= 0] <- NA
potential_dups <- apply(mat,1,function(x) as.list(na.omit(x)))

然而,我无法想象为什么你想要这个输出。它似乎不是最有用的。也许你可以使用以下代码?

potential_dups <- apply(mat,1,function(x) c(na.omit(x)))