如何使用ddply或dplyr针对数据帧计算具有非矢量化输入的多变量函数? [英] How to use ddply or dplyr to evaluate a multivariable function with unvectorized inputs against a data frame?

查看:0
本文介绍了如何使用ddply或dplyr针对数据帧计算具有非矢量化输入的多变量函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试对使用Expand GRID创建的数据集中的一系列点进行数值模拟。如果可能的话,我想使用plyrdplyr。但是,我不懂语法。

下面的代码是否对f分别应用了x和y的值?

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))

推荐答案

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

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

因为您希望将其应用到每一行,所以可以使用plyrdplyr来实现。这些工具是为"拆分-应用-合并"而生的,在这种情况下,你用一些石斑鱼把一个数据框分成几块,对每一块做些什么,然后把它放回原处。您希望为每个单独的行添加一些内容,因此我们将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)

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

这篇关于如何使用ddply或dplyr针对数据帧计算具有非矢量化输入的多变量函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆