합치기 - tidyr




group_by를 사용할 때 dplyr 문제(다중 변수) (4)

dplyly 대신 dplyr을 사용하기를 원하지만 어떻게 작동하는지 (나는 문서를 읽었습니다) 핸들을 얻을 수 없습니다.

예를 들어 mutate ()를 시도 할 때 "group_by"함수가 정상적으로 작동하지 않는 이유는 무엇입니까?

mtcars보고 :

도서관 (자동차)

"cyl"및 "gear"로 그룹화 된 mtcars의 요약 인 data.frame을 만듭니다.

df1 <- mtcars %.%
            group_by(cyl, gear) %.%
            summarise(
                newvar = sum(wt)
            )

그런 다음이 데이터 프레임을 더 요약하고 싶습니다. dply를 사용하면 간단 할 수 있지만 dplyr을 사용하려고 할 때 실제로 그룹화하지는 않습니다.

df2 <- df1 %.%
            group_by(cyl) %.%
            mutate(
                newvar2 = newvar + 5
            )

아직 그룹화되지 않은 결과가 생성됩니다.

  cyl gear newvar newvar2
1   6    3  6.675  11.675
2   4    4 19.025  24.025
3   6    4 12.375  17.375
4   6    5  2.770   7.770
5   4    3  2.465   7.465
6   8    3 49.249  54.249
7   4    5  3.653   8.653
8   8    5  6.740  11.740

문법에 문제가 있습니까?

편집하다:

plyr와 ddply로이 작업을 수행한다면 :

df1 <- ddply(mtcars, .(cyl, gear), summarise, newvar = sum(wt))

그리고 두 번째 df를 얻으려면 :

df2 <- ddply(df1, .(cyl), summarise, newvar2 = sum(newvar) + 5)

그러나 summarize () 함수에서 sum (newvar) + 5를 사용하는 동일한 접근법은 dplyr과 작동하지 않습니다.


dplyr는 예를 들어 예상대로 작동합니다. 지정한대로 mutate는 newvar2를 생성하면서 newvar의 각 값에 5를 더합니다. 그룹화했는지 여부는 동일하게 보입니다. 그러나 그룹별로 다른 것을 지정하면 다른 것을 얻을 수 있습니다. 예 :

df1 %.%
            group_by(cyl) %.%
            mutate(
                newvar2 = newvar + mean(cyl)
            )

나는 비슷한 문제가 있었다. 나는 단순히 plyr 분리가 plyr 해결했다는 것을 발견했다.

detach(package:plyr)    
library(dplyr)

plyr 분리는 문제를 해결할 수있는 하나의 방법이므로 dplyr 함수를 원하는대로 사용할 수 있습니다. 그러나 코드에서 다른 작업을 완료하기 위해 plyr 다른 함수가 필요한 경우에는 어떻게해야합니까?

(이 예제에서는 dplyrplyr 라이브러리를 모두로드했습니다.)

우리가 간단한 data.frame을 가지고 있고 gname 다른 레벨에 의해 그룹화 될 때 변수 value 그룹 별 합계를 계산하려고합니다

> dx<-data.frame(gname=c(1,1,1,2,2,2,3,3,3), value = c(2,2,2,4,4,4,5,6,7))
> dx
  gname value
1     1     2
2     1     2
3     1     2
4     2     4
5     2     4
6     2     4
7     3     5
8     3     6
9     3     7

그러나 우리가 dplyr 그룹화 된 합계를 산출 할 것으로 믿는 것을 사용하려고하면 다음과 dplyr 됩니다.

dx %>% group_by(gname) %>% mutate(mysum=sum(value))
Source: local data frame [9 x 3]
Groups: gname

  gname value mysum
1     1     2    36
2     1     2    36
3     1     2    36
4     2     4    36
5     2     4    36
6     2     4    36
7     3     5    36
8     3     6    36
9     3     7    36

그것은 우리에게 원하는 대답을주지 않습니다. 아마도 dplyrplyr 사이의 group_by 및 / 또는 mutate 함수의 일부 상호 작용이나 오버로드 plyr 있습니다. 우리는 plyr 분리 할 수 ​​있지만 또 다른 방법은 dplyr 버전의 group_bymutate 대한 고유 한 호출을 제공하는 것입니다.

dx %>% dplyr::group_by(gname) %>% dplyr::mutate(mysum=sum(value))
Source: local data frame [9 x 3]
Groups: gname

  gname value mysum
1     1     2     6
2     1     2     6
3     1     2     6
4     2     4    12
5     2     4    12
6     2     4    12
7     3     5    18
8     3     6    18
9     3     7    18

이제 우리는 예상대로 작동한다는 것을 알 수 있습니다.


plyr 코드를 dplyr 로 변환 summarise mutate 대신 summarise 사용하여 동일한 결과를 얻을 수 있습니다.

library(plyr)
df1 <- ddply(mtcars, .(cyl, gear), summarise, newvar = sum(wt))
df2 <- ddply(df1, .(cyl), summarise, newvar2 = sum(newvar) + 5)
df2
##   cyl newvar2
## 1   4  30.143
## 2   6  26.820
## 3   8  60.989

detach(package:plyr)    
library(dplyr)
mtcars %.%
    group_by(cyl, gear) %.%
    summarise(newvar = sum(wt)) %.%
    group_by(cyl) %.%
    summarise(newvar2 = sum(newvar) + 5)
##   cyl newvar2
## 1   4  30.143
## 2   8  60.989
## 3   6  26.820

편집하다

마지막 그룹 ( gear )을 summarise 하면 두 번째 group_by 건너 뛸 수 있습니다 (아래 @hadley 주석 참조)

library(dplyr)
mtcars %.%
    group_by(cyl, gear) %.%
    summarise(newvar = sum(wt)) %.%
    summarise(newvar2 = sum(newvar) + 5)
##   cyl newvar2
## 1   4  30.143
## 2   8  60.989
## 3   6  26.820




compound-key