2017-10-11 107 views
1

我想將一列col名稱傳遞給purrr :: map公式。 這裏是我的問題的reprex:如何將一個df col名稱列表傳遞給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') 

我知道有與dplyr 0.7「quosure」編程的整個新的世界,但是這似乎喜歡的事,是相當普遍的早一點。謝謝你的幫助。

+0

可以用'formula'建立經由'paste'下式:'地圖(list_vars,〜t.test(式(糊( 「MPG〜」,.X)) ,data = cars))' – aosmith

回答

0

您可以這樣做,但如果可以的話,最好不要在處理非標準評估時處理purrr。這是另一種方法:

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

這充分利用了t.test默認S3方法,而不是用於formula類S3方法。所以發生了什麼是你在向量中作爲前兩個參數,而不是在數據框中輸入數據,並告訴在哪裏看。

+0

謝謝你的回答和解釋,對於有效的工作並開始更好地理解它非常有幫助。謝謝! –

+1

儘管這是解決公式問題的一種方法,但是這種't.test'的使用返回例如平均mpg對平均柱面的測試,而不是測試兩個不同柱面類別中的平均mpg。 – aosmith

0

的另一種方法:

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