2016-07-13 2 views
-1

그룹별로 7 일 간의 차이를 만들려고합니다. 그래서, 아래의 코드를 복제하고 7 일 지연과 비슷한 결과를 얻으려고합니다.dplyr 돌연변이가있는 그룹 별 차이점

library(dplyr) 

dat %>% mutate(dx=c(NA, diff(x)), dy=c(NA, diff(y))) 

    x y dx dy 
1 5 3 NA NA 
2 8 9 3 6 
3 3 1 -5 -8 
4 1 5 -2 4 

는하지만 오류 메시지가 점점 오전 :

Error: incompatible size (900), expecting 905 (the group size) or 1

이 오류를 수정하기위한 빠르고 쉬운 방법이있다. 나는 그것이 돌연변이와 관련이있을 수도 있다고 짐작한다.

+0

입력 예제를 보여주십시오. 출력 결과에 따라 'colname1, colname2'가 없습니다. – akrun

+0

[좋은 질문을하는 방법] (http://stackoverflow.com/help/how-to-ask) 및 [ 재현 가능한 예] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610). 이렇게하면 다른 사람들이 당신을 도울 수있게됩니다. 댓글을 주신 덕분에 – Jaap

+0

. 위의 코드와 유일한 차이는 group_by입니다. dat %> % group_by (anything) %> % mutate (dx = c (NA, diff (x)), dy = c (NA, diff (y))). 나는 그것이 쉬운 수정이라는 것을 안다, 나는 단지 내가 r에 상당히 새롭기 때문에 그것을 고치는 법을 모른다. –

답변

3

지연의 일수는 NA으로 채워야한다. 1 NA과 같이 지연 1이있는 첫 번째 행의 차이 값이 부족한 부분을 채우는 것처럼 이제는 7 NA을 사용하여 처음 7 개의 행에 대한 차이 값이 부족하게됩니다. 예는 내장 mtcars 데이터 프레임 :

mtcars %>% 
    mutate(dx = c(NA, diff(mpg)), 
     dx7 = c(rep(NA,7), diff(mpg, 7))) 

또는 그룹과

: Axeman의 좋은 대답은 당신이 또한 내장하고있다 diffzoo 패키지의 버전을 사용할 수 있음을 생각 나게 @

mtcars %>% 
    group_by(am) %>% 
    mutate(dx = c(NA, diff(mpg)), 
     dx7 = c(rep(NA,7), diff(mpg, 7))) 

심. 당신은 방금 diff.zoo 방법 대신 기본 R diff의 파견받을 수 있도록 na.pad 사용할 수 있도록하는 zoo 객체에 벡터를 변환 할 수 있습니다

library(zoo) 

mtcars %>% 
    mutate(dx = diff(zoo(mpg), na.pad=TRUE), 
     dx7 = diff(zoo(mpg), 7, na.pad=TRUE)) 
+0

오 이런! 정말 고맙습니다. 그것은 효과가있다! –

1

내가 전부 diff을 제거하고, dplyr를 사용하기 제안 매우 자신의 lag입니다. 이것은 필요한 NA을 처리합니다.

mtcars %>% 
    mutate(dx = mpg - lag(mpg), 
     dx7 = mpg - lag(mpg, 7)) 
+1

음, 코드 골프에서 우승했습니다! – eipi10

+1

글쎄, 나는 작년에 당신의 답을 통해 많은 것을 배웠다. – Axeman

+1

감사합니다. 알고있는 것이 좋다. – eipi10