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

时间:2017-09-01 05:04:30

标签: r data.table plyr purrr

我有以下代码计算标量输入的输出,并将结果与​​输入一起合并到数据框中。我试着用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]

2 个答案:

答案 0 :(得分:2)

以下是使用tidyverse的解决方案。关键是使用expand.grid创建b1sigma之间的所有组合,然后使用map2应用sim_ar1函数来创建sim1 1}}列。 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已经过矢量化,因此无需使用map2中的purrr。 <{1}}就足够了。

dplyr

答案 1 :(得分:1)

我还使用带有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可以使得更简洁,最后一行是:

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