考虑以下列表:
rows <- structure(list(`1` = 1:40, `2` = 41:79, `3` = 80:118, `4` = 119:157,
`5` = 158:196, `6` = 197:235, `7` = 236:274, `8` = 275:313,
`9` = 314:352, `10` = 353:392),
.Names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"))
我目前正在编写一个循环(由i in (1:10)
编制索引),其中我想生成两个变量。
第一个是rows[[i]]
。例如,i <- 1
时,
> rows[[i]]
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
[40] 40
如何生成第二个向量,该向量由rows
中的所有其他值组成(即i <- 1
时,这会吐出41:392
)?我的想法是使用row_list[[setdiff(1:length(rows), i)]]
,实际上是
> setdiff(1:length(rows), i)
[1] 2 3 4 5 6 7 8 9 10
正如我所料,但是
> rows[[setdiff(1:length(rows), i)]]
Error in rows[[setdiff(1:length(rows), i)]] :
recursive indexing failed at level 2
我知道列表结构看起来很笨拙,但我想将列表保留为列表。
答案 0 :(得分:2)
您可以使用
myFunc <- function(i) setdiff(unlist(rows), rows[[i]])
从剩余的列表元素中提取所有元素的集合差异。代码失败的原因是rows[[<vector>]]
尝试在只有1级深度的列表上实现递归索引。这种形式的索引在深层嵌套列表中非常有用,但这里不需要。
要了解它是如何工作的,请尝试rows[[c(1, 2)]]
和rows[[c(2, 1)]]
以分别从列表元素1和2中提取包含第一个元素的长度为1的向量。帮助文件?"["
的“递归(类似列表)对象”部分提供了其他详细信息。