3
votes

map_dfc pour chaque ligne de dataframe avec des entrées

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) 


0 commentaires

3 Réponses :


1
votes

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)


2 commentaires

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 $ .



2
votes

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 entrez description de l'image ici


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


0 commentaires

1
votes

En prolongeant ce que l'utilisateur a dit, rlang :: exec () peut être utilisé comme le purrr::invoke()

obsolète

0 commentaires