J'ai commencé à apprendre l'utilisation de la bibliothèque "purrr" et je voulais savoir comment je procéderais pour ce qui suit:
Objectif
Appliquer une fonction à chaque ligne du dataframe avec les entrées comme colonnes, et cbind la sortie de la fonction comme une colonne dans le dataframe d'entrée
Idée
D'après la documentation, il semble que map_dfc soit le fonction parfaite ici
Tentative de solution
Error in .f(.x[[i]], ...) : argument "lambda" is missing, with no default
Erreur
library(purrr) library(dplyr) test_func <- function(n, lambda){ return(n+lambda) } n <- seq(1,10,1) lambda <- seq(1, 10, 1) new_df <- list(n=n,lambda=lambda) %>% cross_df() new_df <- map_dfc(new_df, test_func) # even tried the below # new_df <- map_dfc(new_df, ~test_func)
3 Réponses :
Vous devez utiliser la famille de fonctions map2_ *
puisque vous marchez
sur deux colonnes:
n <dbl> 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11
MODIFIER
Vous pouvez réaliser la même chose avec la sortie Reduce
:
Reduce(test_func,new_df) #[1] 2 3 4 5 6 7 8 9 10 11
purrr
de base
:
Vous pouvez renommer votre colonne selon vos besoins:
map2_dfc(new_df[1],new_df[2],test_func)
La sortie est correcte, mais pourquoi le cbind n'a-t-il pas eu lieu sur le new_df. Peut-être que ma compréhension de cette fonction est erronée?
Cette fonction cbind
est le résultat mais ignore les données d'origine. Vous pouvez simplement l'ajouter avec mutate
ou simplement $
.
La méthode purrr
- semble-t-il ** - serait l'utilisation de invoke
do.call(test_func, new_df)
Depuis le fichier d'aide: p>
Cette paire de fonctions permet de combiner plus facilement une fonction et une liste de paramètres pour obtenir un résultat. invoke est un wrapper autour de do.call qui le rend facile à utiliser dans un tube.
Donc, invoke (test_func, new_df)
est identique à
test_func(new_df[[1]], new_df[[2]])
** Le fichier d'aide indique également
Sans le package purrr
new_df %>% mutate(new_col = invoke(test_func, new_df)) # A tibble: 100 x 3 # n lambda new_col # <dbl> <dbl> <dbl> # 1 1 1 2 # 2 2 1 3 # 3 3 1 4 # 4 4 1 5 # 5 5 1 6 # 6 6 1 7 # 7 7 1 8 # 8 8 1 9 # 9 9 1 10 #10 10 1 11 # ⦠with 90 more rows
En prolongeant ce que l'utilisateur a dit, rlang :: exec ()
peut être utilisé comme le purrr::invoke()