我有以下代码计算标量输入的输出,并将结果与输入一起合并到数据框中。我试着用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]
答案 0 :(得分:2)
以下是使用tidyverse
的解决方案。关键是使用expand.grid
创建b1
和sigma
之间的所有组合,然后使用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)))