如何使用 ddply 或 dplyr 针对数据框评估具有非矢量化输入的多变量函数?
How to use ddply or dplyr to evaluate a multivariable function with unvectorized inputs against a data frame?
我正在尝试 运行 对使用扩展网格创建的数据集中的一系列点进行数值模拟。如果可能的话,我想为此使用 plyr
或 dplyr
。但是,我不明白语法。
下面的代码是否存在小扰动,将 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))
让我们重写您的函数以在没有 data_frame
调用的情况下执行相同的操作,仅使用向量会更快:
f <- function(x, y) {
a = x * runif(100) - y
b = a - rnorm(100) * y
sum(a) - sum(b)
}
因为你想把它应用到每一行,你可以用 plyr
或 dplyr
来完成。这些工具是为 "split-apply-combine" 制作的,您可以在其中将数据框由一些石斑鱼分成几块,对每一块做一些事情,然后将它们放回一起。你想对每一行都有一些东西,所以我们将 x
和 y
都设置为分组变量,这是有效的,因为 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))
对于plyr
和dplyr
,都使用了mutate
函数,因为您要向现有数据框添加一列,同时保持相同的行数。另一个常用函数是 summarize
,当您想要将具有多行的组压缩到单个摘要行时使用它。 mutate
与 base::transform
.
非常相似
使用plyr
进行数据框操作确实没有任何优势,dplyr
速度更快,而且大多数人认为更容易理解。当您进行更复杂的操作并使用组而不是单独的行时,它真的很出色。对于个别行,基函数 mapply
效果很好:
X$z = mapply(f, X$x, X$y)
(感谢评论中的@jeremycg)。您可以使用 dplyr
,但在这种情况下没有理由这样做。
我正在尝试 运行 对使用扩展网格创建的数据集中的一系列点进行数值模拟。如果可能的话,我想为此使用 plyr
或 dplyr
。但是,我不明白语法。
下面的代码是否存在小扰动,将 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))
让我们重写您的函数以在没有 data_frame
调用的情况下执行相同的操作,仅使用向量会更快:
f <- function(x, y) {
a = x * runif(100) - y
b = a - rnorm(100) * y
sum(a) - sum(b)
}
因为你想把它应用到每一行,你可以用 plyr
或 dplyr
来完成。这些工具是为 "split-apply-combine" 制作的,您可以在其中将数据框由一些石斑鱼分成几块,对每一块做一些事情,然后将它们放回一起。你想对每一行都有一些东西,所以我们将 x
和 y
都设置为分组变量,这是有效的,因为 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))
对于plyr
和dplyr
,都使用了mutate
函数,因为您要向现有数据框添加一列,同时保持相同的行数。另一个常用函数是 summarize
,当您想要将具有多行的组压缩到单个摘要行时使用它。 mutate
与 base::transform
.
使用plyr
进行数据框操作确实没有任何优势,dplyr
速度更快,而且大多数人认为更容易理解。当您进行更复杂的操作并使用组而不是单独的行时,它真的很出色。对于个别行,基函数 mapply
效果很好:
X$z = mapply(f, X$x, X$y)
(感谢评论中的@jeremycg)。您可以使用 dplyr
,但在这种情况下没有理由这样做。