2017-04-22 11 views
1

자신에게 R tidyverse purr() 패키지를 가르치고 있으며 중첩 데이터 프레임의 열에 map()을 구현하는 데 문제가 있습니다. 누군가 내가 누락 된 부분을 설명 할 수 있을까요? 내가 그렇게 같은 다이어트 # 1 첫 번째 필터 경우 예를 들어 기본 R ChickWeight 데이터 세트를 사용중첩 된 데이터 프레임의 열에 대해 map() 구현

내가 쉽게 다이어트 # 1 아래의 각 평가시기에 대한 관찰의 수를 얻을 수 있습니다 :

library(tidyverse) 
ChickWeight %>% 
    filter(Diet == 1) %>% 
    group_by(Time) %>% 
    summarise(counts = n_distinct(Chick)) 

이 훌륭하지만, 나는 한 번에 각 다이어트를 위해 그것을하고 싶습니다. 나는 데이터를 중첩시키고 그것에 대해 map()으로 반복하는 것이 좋은 접근 방법이 될 것이라고 생각했습니다. 내가 시도에 넣어 파이프를 사용하여이 같은 명령을 구현하지만 때

map(example$data, ~ .x %>% group_by(Time) %>% summarise(counts = n_distinct(Chick))) 

: 다음이지도 기능을 구현

example <- ChickWeight %>% 
    nest(-Diet) 

내가 목표로하고있는 무슨을 달성 : 이것은 내가 무슨 짓을 실패한 원래 데이터 프레임의 다른 열.

example %>% 
    mutate(counts = map(data, ~ .x %>% group_by(Time) %>% summarise(counts = n_distinct(Chick)))) 
Error in eval(substitute(expr), envir, enclos) : 
    variable 'Chick' not found 

왜 이런 현상이 발생합니까?


또한 데이터 프레임을 목록으로 분할하여 시도했지만 작동하지 않았습니다.

ChickWeight %>% 
    split(.$Diet) %>% 
    map(data, ~ .x %>% group_by(Time) %>% summarise(counts = n_distinct(Chick))) 

답변

4

당신이 dplyr NSE의 내부 표준이 아닌 평가를 dplyr 사용하고 있기 때문에, Chick 무엇을 검색 환경에 대한 혼란 얻고있다. 정말, 아마 버그,하지만이보고 위치를 지정 개발 버전의 새로운 .data 대명사, 피할 수 있습니다

library(tidyverse) 

ChickWeight %>% 
    nest(-Diet) %>% 
    mutate(counts = map(data, 
         ~.x %>% group_by(Time) %>% 
          summarise(counts = n_distinct(.data$Chick)))) 
#> # A tibble: 4 × 3 
#>  Diet    data   counts 
#> <fctr>    <list>   <list> 
#> 1  1 <tibble [220 × 3]> <tibble [12 × 2]> 
#> 2  2 <tibble [120 × 3]> <tibble [12 × 2]> 
#> 3  3 <tibble [120 × 3]> <tibble [12 × 2]> 
#> 4  4 <tibble [118 × 3]> <tibble [12 × 2]> 

파이프를 위해 목록을, map 빈의 첫 번째 매개 변수를 남겨 목록을 전달하는 반복하기 :

:

ChickWeight %>% 
    split(.$Diet) %>% 
    map(~ .x %>% group_by(Time) %>% summarise(counts = n_distinct(Chick))) %>% .[[1]] 

#> # A tibble: 12 × 2 
#>  Time counts 
#> <dbl> <int> 
#> 1  0  20 
#> 2  2  20 
#> 3  4  19 
#> 4  6  19 
#> 5  8  19 
#> 6  10  19 
#> 7  12  19 
#> 8  14  18 
#> 9  16  17 
#> 10 18  17 
#> 11 20  17 
#> 12 21  16 

더 간단한 옵션은 모두 열로 불과 그룹에있을 것입니다3210

ChickWeight %>% group_by(Diet, Time) %>% summarise(counts = n_distinct(Chick)) 

#> Source: local data frame [48 x 3] 
#> Groups: Diet [?] 
#> 
#>  Diet Time counts 
#> <fctr> <dbl> <int> 
#> 1  1  0  20 
#> 2  1  2  20 
#> 3  1  4  19 
#> 4  1  6  19 
#> 5  1  8  19 
#> 6  1 10  19 
#> 7  1 12  19 
#> 8  1 14  18 
#> 9  1 16  17 
#> 10  1 18  17 
#> # ... with 38 more rows 
+0

https://github.com/tidyverse/tidyverse에서 개발 버전을 의미합니까? 방금 (1.1.1.9000) 다시 설치하고'.data '를 찾을 수 없습니다. mutate_impl (.data, dots) 오류 : 개체 '. 데이터가 없습니다'. –

+1

Devel dplyr. [here] (https://github.com/hadley/dplyr/)에서 설치할 수 있습니다. – alistaire