2017-10-11 5 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 방법을 활용 : 여기에 또 다른 접근 방법이다. 그래서 일어나는 일은 데이터 프레임을 먹이로 넣는 대신 처음 두 인수로 벡터를 먹이고 어디서 볼지를 알려주는 것입니다.

+0

답변과 설명 모두를 제공해 주셔서 감사 드리며, 더 좋은 점을 이해하고 이해하기 시작하는 데 도움이됩니다. 감사! –

+1

이것은 공식 문제를 해결하는 방법이지만,이 't.test'를 사용하면 두 개의 서로 다른 사이 더 카테고리 중 평균 mpg를 테스트하는 대신 평균 mpg 대 평균 실린더 테스트를 반환합니다. – aosmith

0

또 다른 방법 : 당신은 formula``와 paste``를 통해 수식을 작성 할 수 있습니다

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