2017-10-11 75 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))) 
相关问题