2016-06-23 2 views
1

내 데이터 프레임은 주 이름, 연도 및 각 연도 및 각 주에 대한 세금 영수증의 세 열로 구성됩니다. 아래는 단지 하나의 상태에 대한 예제입니다.dplyr을 사용하여 지연 차액 계산

year RealTaxRevs 
1 1971  8335046 
2 1972  9624026 
3 1973 10498935 
4 1974 10052305 
5 1975  8708381 
6 1976  8911262 
7 1977 10759032 

각 주마다 1 년 단위로 세금 영수증을 변경하고 싶습니다. 나는 다음과 같은 코드를 사용 :

data %>% group_by(state) %>% summarise(diff(RealTaxRevs, lag = 1, differences = 1)) 

를하지만 나에게 "오류 : 단일 값을 기대"를 제공합니다.

누구든지이 오류 메시지를 설명하고 dplyr을 사용하여 올바르게 수행 할 수 있습니까? 고맙습니다.

+3

'summarize'보다는 'mutate'가 필요합니다. 또한 길이가 n 인 벡터가 주어지면'diff'가 길이 n-1의 벡터를 반환하기 때문에 첫 번째 값으로 'NA'를 추가해야합니다. 그래서 코드는 다음과 같습니다 :'mutate (c (NA, diff (RealTaxRevs)))'. 기본값으로 1을 사용하므로'lag' 또는'differences'를 지정할 필요가 없습니다. – eipi10

+0

@ eipi10 완벽하게 작동합니다. 고맙습니다 :). – tnabdb

답변

0

우리는 당신이 기능과 같은 diff를 사용하려는 경우, data.table

library(data.table) 
setDT(data)[, Diffs := RealTaxRevs - shift(RealTaxRevs)[[1]], state] 
0

를 사용뿐만 아니라 zoo 라이브러리를 사용하여 고려할 수 있습니다. 지속적으로 NA를 추가하지 않고, 쉽게 시차의 수를 늘릴 수 있습니다

dat <- data.frame(a=c(8335046, 9624026, 10498935, 10052305, 8708381, 8911262, 10759032)) 
dat %>% mutate(b=diff(as.zoo(a), na.pad=T)) 
#   a  b 
# 1 8335046  NA 
# 2 9624026 1288980 
# 3 10498935 874909 
# 4 10052305 -446630 
# 5 8708381 -1343924 
# 6 8911262 202881 
# 7 10759032 1847770 

이 방법 :처럼 될 것이라고 설정

library(zoo) 
diff(as.zoo(1:4), na.pad=T) 

데이터 프레임에서 : 그럼 당신은 다음과 같은 코드가있을 수 있습니다

dat %>% mutate(b2=diff(as.zoo(a), lag=2, na.pad=T)) 
#   a  b2 
# 1 8335046  NA 
# 2 9624026  NA 
# 3 10498935 2163889 
# 4  NA  NA 
# 5 8708381 -1790554 
# 6 8911262  NA 
# 7 10759032 2050651 
관련 문제