0

我一直在尝试在 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]] list() 第一个元素是 NULL。我还想编写仅从该数据结构中提取非空列表的脚本。

4

2 回答 2

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)]
于 2013-07-10T14:45:59.607 回答
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)))
于 2013-07-10T14:58:05.333 回答