シナリオのリストとシミュレーション関数に基づいて、purrrを使用してシミュレーションを複数回実行するにはどうすればよいですか?
Nov 24 2020
tibble、df、シナリオのリスト、myscenarios、およびシミュレーション関数simuを使用して、次のような結果のtibbleを作成したいと思います。
- 25行のデータ(シナリオごとに5行)
- 結果データフレームには、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, .)