シナリオのリストとシミュレーション関数に基づいて、purrrを使用してシミュレーションを複数回実行するにはどうすればよいですか?

Nov 24 2020

tibble、df、シナリオのリスト、myscenarios、およびシミュレーション関数simuを使用して、次のような結果のtibbleを作成したいと思います。

  1. 25行のデータ(シナリオごとに5行)
  2. 結果データフレームには、x、n、v、シナリオ、結果の列が含まれている必要があります。

適切なpurrr関数を使用してこれを実現したいと思います。

以下の要約は、tibble、5つのシナリオのリスト、およびsimu関数を提供します。現在の出力は、単にdftibbleに対してsimu関数を利用しています。

lmapはこれを達成するための正しいpurrr関数でしょうか?もしそうなら、mutateと組み合わせてlmapを使用する必要がありますか?

library(tidyverse)
df <- tibble(x= 1:5, 
             n= c("Jim","John","Jane","Jay","Jack"),
             v= 11:15)

myscenarios <- list("one", "two", "three", "four", "five")

simu <- function(x, v){
  x * v + sample(1:10, 1)
} 

result <- df %>% 
  mutate(result = simu(x, v))

result
#> # A tibble: 5 x 4
#>       x n         v result
#>   <int> <chr> <int>  <int>
#> 1     1 Jim      11     21
#> 2     2 John     12     34
#> 3     3 Jane     13     49
#> 4     4 Jay      14     66
#> 5     5 Jack     15     85

reprexパッケージ(v0.3.0)によって2020-11-23に作成されました

回答

1 akrun Nov 24 2020 at 05:51

listで名前をループし、map:=)を評価しながらassign()を使用して!!、出力を名前に割り当てることができます。

library(dplyr)
library(purrr)
map_dfc(myscenarios, ~ df %>% 
                   transmute(!! .x := simu(x, v))) %>%
      bind_cols(df, .)

-出力

# A tibble: 5 x 8
#      x n         v   one   two three  four  five
#  <int> <chr> <int> <int> <int> <int> <int> <int>
#1     1 Jim      11    16    17    20    13    15
#2     2 John     12    29    30    33    26    28
#3     3 Jane     13    44    45    48    41    43
#4     4 Jay      14    61    62    65    58    60
#5     5 Jack     15    80    81    84    77    79

list'myscenarios'の要素に対応する関数がある場合は、両方をループしmap2てから関数を適用し(同じ引数があると仮定)、データセットで単一の列を返しtransmute、元のデータセットとバインドします

lstfn <- list(simu, simu, simu, simu, simu)
map2_dfc(myscenarios, lstfn, ~ df %>%
         transmute(!! .x := .y(x, v))) %>%
     bind_cols(df, .)