Wie füge ich meiner pmap_dfc-Anweisung ein drittes dynamisches Listenelement hinzu?
Ich habe den folgenden Arbeitscode, der zwei Listen verwendet, um eine Simulationsausgabe zu erzeugen:
strategy_list <- list("s_Win","s_WinH1", "s_WinH2", "s_WinH1F1", "s_WinH2F2", "s_WinDerEx")
function_list <- list(s_win, s_winH1, s_winH2, s_winH1F1, s_winH2F2, s_winDerEx)
l <- list(strategy_list, function_list)
simulation <- pmap_dfc(l, ~ df %>%
transmute(!! .x := .y(entries, skill, field, win_payoff, wager_amt, Winner, exacta_payoff))) %>%
bind_cols(df, .)
Jetzt möchte ich die Simulation auf verschiedenen Schwierigkeitsstufen ausführen. Daher habe ich eine Schleife hinzugefügt und versucht, die Fertigkeitseingabe durch i aus der Schleife zu ersetzen, um verschiedene Variationen der Simulation zu erstellen:
for (i in seq(from = 0.15, to=0.30, by=0.05)){
skill_list <- list(i, i, i, i, i, i)
strategy_list <- list("s_Win","s_WinH1", "s_WinH2", "s_WinH1F1", "s_WinH2F2", "s_WinDerEx")
function_list <- list(s_win, s_winH1, s_winH2, s_winH1F1, s_winH2F2, s_winDerEx)
l <- list(skill_list, strategy_list, function_list)
simulation <- pmap_dfc(l, ~ df %>%
transmute(!! .w !! .x := .y(entries, i, field, win_payoff, wager_amt, Winner, exacta_payoff))) %>%
bind_cols(df, .)
}
Dies führt leider zu einem Fehler. Ich habe verschiedene Variationen ausprobiert, kann aber den Code nicht zum Laufen bringen.
EDIT: Basierend auf Atems Beitrag unten habe ich meinen Code wie folgt aktualisiert:
for (i in seq(from = 0.15, to=0.30, by=0.05)){
strategy_list <- list("s_Win","s_WinH1", "s_WinH2", "s_WinH1F1", "s_WinH2F2", "s_WinDerEx") %>% stringr::str_c(i)
function_list <- list(s_win, s_winH1, s_winH2, s_winH1F1, s_winH2F2, s_winDerEx)
skill_list <- list(i, i, i, i, i, i)
l <- list(strategy_list, function_list, skill_list)
simulation <- pmap_dfc(l, ~ df %>%
transmute(!! ..1 := ..2 (entries, ..3, field, win_payoff, wager_amt, Winner, exacta_payoff))) %>%
bind_cols(df, .) %>%
Leider führt dies immer noch zu einem Fehler. Das Problem scheint bei ..2 zu liegen, da dies nicht die gleiche Syntaxhervorhebung wie bei ..1 und ..3 erhält.
EDIT 2: Um dies ein bisschen einfacher zu machen, habe ich eine vereinfachte Version meiner Frage zusammengestellt und einen Reprex eingefügt. Simulation1 mit zwei Listen funktioniert einwandfrei. Simulation2 mit drei Listen und die Schleife schlägt mit der Fehlermeldung fehl: Funktion "..2" konnte nicht gefunden werden.
``` r
library(tidyverse)
z <- 5
df <- tibble(x=1:10, y=1:10)
s_win <- function(x,y,z){
a <-rnorm(x) + x + y + 1 +z
a
}
s_win1 <- function(x,y,z){
b <- rnorm(x) + x + y + 2 + z
b
}
s_win2 <- function(x,y,z){
c <- rnorm(x) + x + y + 3 +z
c
}
# Simulation1 with two list works.
strategy_list <- list("s_Win","s_Win1", "s_Win2")
function_list <- list(s_win, s_win1, s_win2)
l <- list(strategy_list, function_list)
simulation1 <- pmap_dfc(l, ~ df %>%
transmute(!! .x := .y (x, y, z))) %>%
bind_cols(df, .) %>%
pivot_longer(
cols = starts_with("s_"),
names_to = "Strategy",
names_prefix = "s_",
values_to = "Value",
values_drop_na = TRUE
)
View(simulation1)
# Simulation 2 with thre list does not work. Error message = could not find function "..2"
for (i in seq(from = 5, to=20, by=5)){
strategy_list <- list("s_Win","s_Win1", "s_Win2") %>% stringr::str_c(i)
function_list <- list(s_win, s_win1, s_win2)
skill_list <- list(i, i, i)
l <- list(strategy_list, function_list, skill_list)
simulation2 <- pmap_dfc(l, ~ df %>%
transmute(!! ..1 := ..2 (x, y, ..3))) %>%
bind_cols(df, .) %>%
pivot_longer(
cols = starts_with("s_"),
names_to = "Strategy",
names_prefix = "s_",
values_to = "Value",
values_drop_na = TRUE
)
}
#> Error: Problem with `mutate()` input `s_Win5`.
#> x could not find function "..2"
#> i Input `s_Win5` is `..2(x, y, ..3)`.
View(simulation2)
#> Error in as.data.frame(x): object 'simulation2' not found
```
Erstellt am 25.11.2018 durch das reprex-Paket (v0.3.0)
Antworten
Die Spaltennamen werden in gespeichert strategy_list
, wo Sie Folgendes einfügen möchten i
:
strategy_list <- list("s_Win","s_WinH1", "s_WinH2",
"s_WinH1F1", "s_WinH2F2", "s_WinDerEx") %>%
stringr::str_c(i)
Da Sie nun drei Listen in haben l
, werden Sie auch auf Schalter wollen mit ..1
, ..2
etc. statt .x
und .y
(die nur für zwei Gruppen von Argumenten angemessen):
simulation <- pmap_dfc(l, ~ df %>%
transmute(!! ..1 := rlang::exec(..2, entries, ..3, field, win_payoff,
wager_amt, Winner, exacta_payoff))) %>%
bind_cols(df, .)
!!
Kleiner Hinweis : Der Operator wird als "Aufheben der Anführungszeichen" bezeichnet. Ohne sie transmute
würde eine Spalte erstellt, die aufgerufen wird, .x
anstatt die in gespeicherten Namen zu verwenden .x
. Hier ist ein Beispiel, das den Unterschied zeigt:
x <- "result"
mtcars %>% transmute( x = "Hello World" )
# x
# 1 Hello World
# 2 Hello World
# ...
mtcars %>% transmute( !!x := "Hello World" )
# result
# 1 Hello World
# 2 Hello World
# ...
BEARBEITEN, um das ..2
Problem zu beheben : Aus irgendeinem Grund treten pmap
Probleme beim Interpretieren ..2
auf, das eine Funktion enthält. Eine einfache Problemumgehung besteht darin rlang::exec
, diese Funktion mit den angegebenen Argumenten auszuführen:
simulation2 <- pmap_dfc(l, ~ df %>%
transmute(!! ..1 := rlang::exec(..2, x, y, ..3))) %>%
# ... as before
Ich habe auch die ursprüngliche Antwort oben aktualisiert.