2017-10-11 5 views
1

Je voudrais passer une liste de noms de col à une formule purrr :: map. Voici un reprex de ma question:Comment transmettre une liste de noms de colonnes df à une formule purrr :: map?

library(dplyr) 
    library(purrr) 
    #Make a toy df of w vars of 2 levels 
    cars <- mtcars %>% 
    select(mpg, cyl, carb) %>% 
    filter(cyl == 4 | cyl == 6, 
      carb == 2 | carb == 4) 

    #normal fn call, works fine 
    t.test(mpg ~ cyl, data = cars) 
    t.test(mpg ~ carb, data = cars) 

    Welch Two Sample t-test 
    data: mpg by cyl 
    t = 3.5371, df = 7.0689, p-value = 0.009356 

    Welch Two Sample t-test 
    data: mpg by carb 
    t = 3.5371, df = 7.0689, p-value = 0.009356 

    #Make list of cols 
    list_vars <- names(cars[,-1]) 
    list_vars 
    [1] "cyl" "carb" 

    #Attempt map with formula fn call 
    map(list_vars, ~ t.test(mpg ~ .x, data = cars)) 

    #Results in this error 
    Error in model.frame.default(formula = mpg ~ .x, data = cars) : 
    variable lengths differ (found for '.x') 

Je sais qu'il ya un nouveau monde de « quosure » avec dplyr 0,7 programmation, mais cela semble quelque chose qui serait assez commun et que antidater. Merci pour toute aide.

+0

Vous pouvez construire la formule via '' paste' avec formula': carte '(de list_vars, ~ t.test (formule (pâte ("mpg ~", .x)) , data = cars)) ' – aosmith

Répondre

0

Vous pouvez faire ce qui précède, mais il est préférable de ne pas faire face à une évaluation non standard lorsque vous travaillez avec purrr si vous le pouvez. Voici une autre approche:

list_vars %>% 
    map(~ t.test(cars[[.x]], cars$mpg)) 

Ce met à profit la méthode par défaut S3 de t.test au lieu de la méthode S3 pour la classe formula. Donc, ce qui se passe est que vous alimentez en vecteurs comme les deux premiers arguments au lieu de nourrir dans un dataframe et dire t.test où chercher.

+0

Merci pour la réponse et l'explication, très utile pour avoir quelque chose qui fonctionne et commencer à mieux le comprendre. Merci! –

+1

Bien que ce soit un moyen de contourner le problème de la formule, cette utilisation de 't.test' renvoie des tests de, par exemple, mpg moyen vs cylindre moyen au lieu de tester mpg moyen parmi les deux différentes catégories de cymbalettes. – aosmith

0

Une autre approche:

map(list_vars, ~ t.test(mpg ~ col, data = cars %>% rename_("col" = .x)))