【发布时间】:2016-11-28 11:38:20
【问题描述】:
假设您有一个未定义的 nr 个列表作为函数的可能参数,例如可以选择以下 3 个(此示例尽可能简单,因此向量存储在列表中):
a <- list(c(1,2,3,4,5))
b <- list(c(3,6,7,2,1))
c <- list(c(3,9,8))
如果我想计算所有三个列表的交集,可以这样做:
Map(intersect,c,Map(intersect,a,b))
# or equivalent:
mapply(intersect,c,mapply(intersect,a,b,SIMPLIFY=F))
# [1] 3
但是如何将参数的 nr 更改为未定义?我读到了...,但我无法让它工作。第一个想法是写一个函数,它可以有...定义的多个列表参数:
intersectio <- function(...){
Map(function(...){
intersect(...)
})
}
问:但这当然行不通,因为 intersect 必须递归应用。有没有办法在 R 中实现这一点?
Q2:这是一个带有嵌套列表结构的更新示例。在这种情况下怎么做,即将父列表的每个子列表与其他父列表的关联子列表(相同索引)相交?
a <- list(list(c(1,2,3,4,5)),list(c(3,6,7,2,1)),list(c(3,9,8)))
b <- list(list(c(1,2)),list(c(3,6,9,11,12)),list(c(3)))
c <- list(list(c(1,9)),list(c(65,23,12)),list(c(14,15)))
【问题讨论】:
-
intersectio
-
可能是
Reduce(function(x, y) Map(intersect, x, y), list(a, b, c))?您需要提供一个具有代表性的可重现示例。 -
对于您的示例,这应该有效:
Reduce(intersect, c(...)) -
好的,感谢到目前为止的 cmets,两者都适用于我的初始示例。正如建议的那样,我目前正在制作一个更能代表我的数据 str/问题的嵌套列表示例
-
看来这可行:
mapply(function(...) Reduce(intersect, c(...)), a, b, c)