【问题标题】:Obtain common elements from 2 lists of unequal length从 2 个长度不等的列表中获取共同元素
【发布时间】:2018-07-23 07:20:22
【问题描述】:

我的数据结构如下:

xy
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[1]  2  3  4  5  6  7  8  9 10 11 12

xyz
[[1]] 
[[1]] [[1]]
[1] 3 4 5 6 7 8 9 10
[[2]]
[[2]] [[1]]
[1]  5  6  7  8  9 10 11 12 13 14 15
[[3]]
[[3]] [[1]]
[1]  6  7  8  9 10 11 12

我想找到列表的每个子集中存在的共同元素。 我的预期输出是:

New_list
[[1]]
[1] 3 4 5 6 7 8 9 10
[[2]]
[1] 5  6  7  8  9 10 11 12 
[[3]]
[1] 6  7  8  9 10 11 12

最初我尝试了以下命令:

Map(intersect,xy,xyz)

但是,它显示以下错误:

警告信息: 在 mapply(FUN = f, ..., SIMPLIFY = FALSE) 中: 更长的参数不是更短的长度的倍数**

我猜这与列表的不等长有关,因为我的命令适用于等长的列表。

【问题讨论】:

  • 您可以输入您的数据吗?
  • xy 的第三个元素与xyz 的第三个元素的交集应该为空,因为xy 的第三个元素不存在。

标签: r


【解决方案1】:

我们unlist第一个list,压平第二个并循环list并使用intersect

lapply(do.call(c, xyz), function(x) intersect(x, unlist(xy)))
#[[1]]
#[1]  3  4  5  6  7  8  9 10

#[[2]]
#[1]  5  6  7  8  9 10 11 12

#[[3]]
#[1]  6  7  8  9 10 11 12

数据

xy <- list(1:10, 2:12)
xyz <- list(list(3:10), list(5:15), list(6:12))

【讨论】:

  • lapply(xyz,function(x) intersect(x[[1]], unlist(xy)))
【解决方案2】:
l1 <- list(1:10,2:12)

l2 <- list(list(3:10),list(5:15),list(6:12))


lapply(unlist(l2,recursive=F),function(x){intersect(unlist(l1),x)})

【讨论】:

  • 其实这和akrun的回答一样。看不出有什么区别。
  • 第一部分不同,但你是对的。非常接近。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
相关资源
最近更新 更多