【问题标题】:Is there an efficient R function to generate a dataframe from a function?是否有一个有效的 R 函数来从函数生成数据帧?
【发布时间】:2021-07-28 17:01:04
【问题描述】:

我想生成一个数据框,其中每一行都由几个属性的叉积函数给出。 这可以强制完成:

seed <- expand.grid(
  c(1,2,3), 
  c(4,5,6)
)
d <- data.frame() 
for(i in 1:nrow(seed)) {
  d[i,"prop1"] = f(seed[i,])
  d[i,"prop2"] = g(seed[i,])
}

其中fg 是函数。但我更喜欢功能版本。我尝试使用pmap

pmap(seed, ~ data.frame(
  prop1 = f(..1, ..2), 
  prop2 = g(..1, ..2))
)

但这并没有给我一个数据框。有没有一种(有效的)方法可以在没有循环的情况下做到这一点?

【问题讨论】:

  • fg 是做什么的?
  • 你最好的选择是用一些聪明的矩阵代数替换这些函数。我不知道这是否可能,因为您还没有共享功能。
  • f 和 g 是任意函数,没有返回单个值的副作用。我需要一个内部结构无关紧要的解决方案。
  • 您对问题的约束越多,解决方案的效率就越高。对于任意函数,解释语言只能做这么多。默认情况下,R 已经激活了 JIT 字节编译。如果您不愿意对此进行更多限制,我相信如果您不愿意优化函数的实现并在 Rcpp 中理想地实现您的函数,那么您将不走运。

标签: r dataframe functional-programming


【解决方案1】:

如果fg 返回原子值以填充数据帧d,为什么不直接返回完整的向量,而是通过将seed 传递给函数呢?例如

d$prop1 <- f(seed)
d$prop2 <- g(seed)

【讨论】:

  • 图像f 类似于sum。对于sum,我们有rowSums,但是对于这样的任意函数没有有效的解决方案。
  • 如果f(seed[i, ])返回单个值,则更新f以接受seed作为参数并在函数本身中处理所有i,存储为向量并返回向量。我错过了什么吗?
猜你喜欢
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2013-02-21
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 2019-12-24
  • 2020-09-08
相关资源
最近更新 更多