【问题标题】:R functions similar to "outer" but return a list [closed]R函数类似于“外部”但返回一个列表[关闭]
【发布时间】:2017-04-07 21:49:30
【问题描述】:

我有两个向量,a 和 b,这两个向量的长度不同。我希望对 a 和 b 中条目的所有可能组合评估函数 f。一个可能的解决方案是: outer(a,b,f)

但是,外部函数只返回二维数组,函数 f 返回一个列表。我想知道是否有类似于outer的函数可以返回一个列表。

我检查了包 plyr/dplyr 并没有找到类似的功能。我知道这个问题可以通过 for 循环、嵌套 lapply 或首先将参数 a 和 b “外部”放入一个数组然后使用 apply 来解决。我想知道是否有优雅的方法来解决这个问题。

【问题讨论】:

  • combn 有一个参数可以将函数应用于组合。但这太宽泛了。我们需要一些细节。
  • outer 应该能够返回一个包含列表条目的矩阵。我的猜测是您的 f 函数未矢量化。 ?Vectorize
  • 同意需要代码的亲密选民。我们已经等待了足够长的时间来响应该请求。查看 SO 帮助页面:minimal reproducible example
  • 这里的代码证明关于外部不处理列表的说法是错误的:x = 1:3; y = 6:7; f <- function(a,b) { lapply(a, function(a) list(a,b) )}; outer(x,y,f)

标签: r dplyr apply plyr


【解决方案1】:

你可以使用lapply

x = 1:3
y = 6:7

1.使用outer

outer(x, y, "+")
#     [,1] [,2]
#[1,]    7    8
#[2,]    8    9
#[3,]    9   10

2。使用lapply

lapply(x, function(a) a+y)
#[[1]]
#[1] 7 8

#[[2]]
#[1] 8 9

#[[3]]
#[1]  9 10

【讨论】:

  • 感谢您的回复,有没有其他的使用单个函数来完成这个而不首先使用外部的?
  • 可能需要lapply(a, function(a){ lapply(b, function(b){f(a,b)}) })。我的猜测是他的f 没有被矢量化,如果是这样,你的“+”示例具有误导性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
相关资源
最近更新 更多