收集列表中的所有其他向量并合并为一个向量

时间:2017-10-25 16:12:36

标签: r

考虑以下列表:

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

我知道列表结构看起来很笨拙,但我想将列表保留为列表。

1 个答案:

答案 0 :(得分:2)

您可以使用

myFunc <- function(i) setdiff(unlist(rows), rows[[i]])

从剩余的列表元素中提取所有元素的集合差异。代码失败的原因是rows[[<vector>]]尝试在只有1级深度的列表上实现递归索引。这种形式的索引在深层嵌套列表中非常有用,但这里不需要。

要了解它是如何工作的,请尝试rows[[c(1, 2)]]rows[[c(2, 1)]]以分别从列表元素1和2中提取包含第一个元素的长度为1的向量。帮助文件?"["的“递归(类似列表)对象”部分提供了其他详细信息。