我一直在尝试在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。我还想编写脚本,只从该数据结构中排除非空列表。
答案 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)))