使用 R 中的 purrr 或 plyr 计算和合并矢量输出与标量输入

Calculate and merge vector output with scalar input using purrr or plyr in R

我有以下代码计算标量输入的输出并将结果与​​输入一起合并到数据框中。我试图用 purrr 和 plyr 做同样的事情,但卡住了。谁能提供一些等效的代码?

library(data.table)
library(magrittr)

sigma = rep(2,5)

sim_ar1 = function(b1,sigma) b1 + sigma

data.table(b1 = seq(0.9,1,0.03)) %>% 
  .[,
    data.frame(sigma, sim1 = sim_ar1(b1,sigma)), 
    by = b1]

这是一个使用 tidyverse 的解决方案。关键是使用expand.grid创建b1sigma之间的所有组合,然后使用map2应用sim_ar1函数创建sim1 列。 dt 看起来应该与 data.table.

的示例输出相同
library(tidyverse)

sigma <- rep(2,5)
b1 <- seq(0.9,1,0.03)
sim_ar1 <- function(b1,sigma) b1 + sigma

dt <- expand.grid(b1 = b1, sigma = sigma) %>%
  arrange(b1) %>%
  mutate(sim1 = map2(b1, sigma, sim_ar1))

dt
     b1 sigma sim1
1  0.90     2  2.9
2  0.90     2  2.9
3  0.90     2  2.9
4  0.90     2  2.9
5  0.90     2  2.9
6  0.93     2 2.93
7  0.93     2 2.93
8  0.93     2 2.93
9  0.93     2 2.93
10 0.93     2 2.93
11 0.96     2 2.96
12 0.96     2 2.96
13 0.96     2 2.96
14 0.96     2 2.96
15 0.96     2 2.96
16 0.99     2 2.99
17 0.99     2 2.99
18 0.99     2 2.99
19 0.99     2 2.99
20 0.99     2 2.99

更新

其实,由于sim_ar1是矢量化的,所以不需要使用purrr中的map2dplyr一个人就够了。

library(dplyr)

dt <- expand.grid(data_frame(b1 = b1, sigma = 2)) %>%
  arrange(b1) %>%
  mutate(sim1 = sim_ar1(b1, sigma))

我还使用地图 bind_rows 开发了一个答案,并想在这里分享

library(data.table)
library(magrittr)

sigma = rep(2,5)

sim_ar1 = function(b1,sigma) b1 + sigma

map(b1, ~data.frame(b1 = .x, results = sim_ar1(.x,sigma))) %>%  bind_rows()

正如@ycw 所建议的那样,使用 map_df 可以使 come 更简洁,最后一行将是:

map_df(b1, ~data.frame(b1 = .x, results = sim_ar1(.x,sigma)))