【问题标题】:How to use ddply or dplyr to evaluate a multivariable function with unvectorized inputs against a data frame?如何使用 ddply 或 dplyr 针对数据框评估具有未矢量化输入的多变量函数?
【发布时间】:2015-06-23 20:14:22
【问题描述】:

我正在尝试对使用扩展网格创建的数据集的一系列点进行数值模拟。如果可能的话,我想使用plyrdplyr。但是,我不明白语法。

下面的代码是否有一点小扰动,将 x 和 y 的值分别应用于 f?

f <- function(x, y) {
    A <- data_frame(a = x*runif(100) - y)
    B <- data_frame(b = A$a - rnorm(100)*y)
    sum(A$a) - sum(B$b)
}

X <- expand.grid(x = 1:10, y = 2:8)
X %>% mutate(z = f(x, y))

我曾希望 ddply 可以让这更容易。

编辑:这似乎符合预期:

 X %>% ddply(.(x, y), transform, z = f(x, y))

【问题讨论】:

  • 你遇到了什么错误?
  • 有分组吗?还是你只是对每一行都做同样的事情?
  • 我想对每一行做同样的事情:使用每一行中的值来评估函数。我想我在sum 上绊倒了。没有分组。
  • 没有 group_by 的东西,你也可以只使用普通的 mapply 函数,而不是 ddply 或 dplyr。 X$z&lt;-mapply(f,X$x,X$y)
  • 另外,你函数中的data_frames 没有做任何有用的事情,删除它们会让你的函数更有效率。

标签: r plyr


【解决方案1】:

让我们重写你的函数以在没有data_frame 调用的情况下做同样的事情,只使用向量会更快:

f <- function(x, y) {
    a = x * runif(100) - y
    b = a - rnorm(100) * y
    sum(a) - sum(b)
}

由于您想将其应用于每一行,您可以使用plyrdplyr 来实现。这些工具是为“split-apply-combine”而设计的,您可以在其中将数据框由一些 grouper 拆分为多个部分,对每个部分执行某些操作,然后将其重新组合在一起。您想为每一行设置一些内容,因此我们将 xy 都设置为分组变量,这是因为 x 和 y 的组合唯一地定义了一行:

# plyr
ddply(X, .(x, y), plyr::mutate, z = f(x, y))

# dplyr
group_by(X, x, y) %>% dplyr::mutate(z = f(x, y))

对于plyrdplyr,使用mutate 函数是因为您希望在现有数据框中添加一列,同时保持相同的行数。另一个常用函数是summarize,当您想要将具有多行的组压缩为单个摘要行时使用该函数。 mutatebase::transform 非常相似。

使用plyr 进行数据框操作确实没有任何优势,dplyr 更快,并且大多数人认为更容易理解。当您有更复杂的操作并且使用组而不是单独的行时,它真的会发光。对于单个行,基本函数 mapply 运行良好:

X$z = mapply(f, X$x, X$y)

(感谢 cmets 中的@jeremycg)。您可以使用dplyr,但在这种情况下没有理由这样做。

【讨论】:

  • plyr::mdply(X, f) 是我仍然更喜欢 plyr 而不是 dplyr 的唯一原因
  • 确实不错,我没用过。我仍然为ldplyllply 等拔出 plyr。
猜你喜欢
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 2015-08-05
  • 2019-08-28
  • 1970-01-01
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多