【问题标题】:Calculate and merge vector output with scalar input using purrr or plyr in R在 R 中使用 purrr 或 plyr 计算向量输出并将其与标量输入合并
【发布时间】:2017-09-01 05:04:29
【问题描述】:

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

【问题讨论】:

  • 仅供参考,使用data.frame(...) 可能会很慢github.com/Rdatatable/data.table/wiki/… 更多标准代码将是data.table(b1 = seq(0.9,1,0.03))[, .(sigma = sigma, sim1 = sim_ar1(b1, sigma)), by=b1]
  • @Frank,感谢您的帮助!

标签: r data.table plyr purrr


【解决方案1】:

这是使用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中的map2。单独dplyr 就足够了。

library(dplyr)

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

【讨论】:

  • 您也可以查看expandcomplete
  • sim_ar1 是矢量化的,为什么这里要用 map2?
  • @Frank 你是对的。我试图适应 purrr 的使用,但似乎单独使用 dplyr 就足够了。
  • 感谢您的帮助,我确实向您学习了 expand.grid 的用法。我也发了一个答案,你可以看看~
【解决方案2】:

我还使用带有 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)))

【讨论】:

  • 感谢分享这个解决方案。你也可以map_df(b1, ~data.frame(b1 = .x, results = sim_ar1(.x,sigma)))。通过这样做,您可以删除%&gt;% bind_rows() 以使代码更简洁。
  • @ycw,感谢您的 cmets,我会更新我的答案。
猜你喜欢
  • 1970-01-01
  • 2021-03-01
  • 2018-04-25
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 2020-04-21
相关资源
最近更新 更多