2017-10-11 9 views
1

私は、purrr :: map式にcol名のリストを渡したいと思います。 は、ここに私の問題のreprexです:私はdplyr 0.7と「quosure」プログラミングの全体の新しい世界が存在しているはず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') 

が、これはかなり一般的で、それをさかのぼると何かのように思えます。助けてくれてありがとう。

+0

: 'マップ(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メソッドを利用します。ここでは別のアプローチです。だからこそ、データフレームの中で最初の2つの引数としてベクトルを供給して、どこに見るかをt.testに伝えています。

+0

両方の答えと説明をありがとう、何かを働かせて、それをより良く理解し始めるのに非常に役立ちます。ありがとう! –

+1

これは数式の問題を回避する方法ですが、この 't.test'の使用は、2つの異なったサイダインカテゴリの中で平均mpgをテストするのではなく、平均mpgと平均シリンダのテストを返します。 – aosmith

0

別のアプローチ:あなたはformula` `とpaste``経由して式を構築することができます

map(list_vars, ~ t.test(mpg ~ col, data = cars %>% rename_("col" = .x))) 
関連する問題