假设您有一个未定义的列表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(...)
})
}
问:但这当然不起作用,因为必须递归地应用相交。在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)))
答案 0 :(得分:2)
正如@Roland建议的那样,您可以使用Reduce
来解决您的问题。对于平面列表(如问题的第一个版本),您可以使用以下内容:
Reduce(intersect, c(a, b, c))
对于嵌套列表(如更新后的问题),您只需将其包含在mapply
调用中:
mapply(function(...) Reduce(intersect, c(...)), a, b, c)
要概括,您可以定义一个函数,然后根据需要使用尽可能多的参数调用它。
list_intersect <- function(...){
mapply(function(...) Reduce(intersect, c(...)), ...)
}
list_intersect(a, b, c)