使用 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
创建b1
和sigma
之间的所有组合,然后使用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
中的map2
。 dplyr
一个人就够了。
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)))
我有以下代码计算标量输入的输出并将结果与输入一起合并到数据框中。我试图用 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
创建b1
和sigma
之间的所有组合,然后使用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
中的map2
。 dplyr
一个人就够了。
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)))