【问题标题】:mapply multiple undefined arguments映射多个未定义的参数
【发布时间】: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)

标签: r arguments mapply


【解决方案1】:

正如@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)

【讨论】:

  • 非常好。还有一件事:在这里我们为 a、b 和 c 做这件事。如果我们想将它推广到未定义数量的参数,解决方案会是什么样子?我不能简单地将 a、b 和 c 替换为 ...
猜你喜欢
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2017-08-15
  • 2012-08-28
  • 2023-04-10
  • 2021-12-12
  • 2021-11-02
相关资源
最近更新 更多