我有一个系数数据框和一个参数数据框。例子:
coefficients <- data.frame(a = c(1, 2, 3),
b_w = c(3, 4, 5),
b_x = c(5, 6, 7))
parameters <- data.frame(w = c(0, 1),
x = c(2, 3))
我想通过将系数和参数的所有组合乘以这两个数据帧来生成一个数据框,其中每列都根据参数数据框中的相关行号进行编号。例子:
output <- data.frame(
params1 = c(coefficients$a[1] + coefficients$b_w[1]*parameters$w[1] + coefficients$b_x[1]*parameters$x[1],
coefficients$a[2] + coefficients$b_w[2]*parameters$w[1] + coefficients$b_x[2]*parameters$x[1],
coefficients$a[3] + coefficients$b_w[3]*parameters$w[1] + coefficients$b_x[3]*parameters$x[1]),
params2 = c(coefficients$a[1] + coefficients$b_w[1]*parameters$w[2] + coefficients$b_x[1]*parameters$x[2],
coefficients$a[2] + coefficients$b_w[2]*parameters$w[2] + coefficients$b_x[2]*parameters$x[2],
coefficients$a[3] + coefficients$b_w[3]*parameters$w[2] + coefficients$b_x[3]*parameters$x[2]
)
)
在我看来,这必须是可能的使用purrr
,但我不知道如何开始。
您可以在这里使用矩阵乘法:
coefs <- as.matrix(coefficients)
params <- as.matrix(parameters)
out <- coefs %*% t(cbind(1, params))
colnames(out) <- paste0("params", 1:2)
out
# params1 params2
#[1,] 11 19
#[2,] 14 24
#[3,] 17 29
@markus提供了一个优雅的基于矩阵的解决方案,但是(根据问题标题)我正在寻找一个基于purrr
的解决方案。我还没有找到一个,但我确实有一个解决方案,仍然在tidyverse
:
library(tidyverse)
parameters %>%
mutate(params = row_number()) %>%
crossing(coefficients) %>%
mutate(output = a + b_w*w + b_x*x) %>%
select(params, output) %>%
pivot_wider(names_from = params,
names_prefix = "params",
values_from = output,
values_fn = list) %>%
unnest(cols = everything())