2012-12-21 3 views
1

이것은 Subtract previous year's from value from each grouped row in data frame의 확장입니다. plyr을 사용하는 옵션은 완전한 의미를가집니다.R 데이터 프레임 : 행간 계산

이제 두 개 이상의 열을 추가하려고합니다. 또한 이드의 시작점이 다른 실제 연도가되도록 올해를 수정했습니다. https://dl.dropbox.com/u/9699533/df.txt

enter image description here

는 내가 현재 행에있을 때 이전 행에 대한 포인터를 얻을 수 없습니다입니다 : 다음 탭으로 구분 된 DF에 대한 링크입니다. 이것을 plyr :: transform의 함수 부분에 전달하고 싶습니다. 이걸 어떻게 쓸 수 있니? 감사!

~ ~ ~ ~ 대체 dataframe 입력 ~ ~ ~ ~ ~

> dput(df) 
structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 
4L, 4L, 5L, 5L, 5L), value = c(6L, 16L, 21L, 5L, 10L, 26L, 2L, 
12L, 26L, 9L, 16L, 26L, 2L, 15L, 29L), year = c(2007L, 2008L, 
2009L, 2011L, 2012L, 2013L, 2004L, 2004L, 2006L, 2010L, 2011L, 
2012L, 2014L, 2015L, 2016L), actual = c(6L, 10L, 5L, 5L, 5L, 
16L, 2L, 10L, 14L, 9L, 7L, 10L, 2L, 13L, 14L)), .Names = c("id", 
"value", "year", "actual"), class = "data.frame", row.names = c(NA, 
-15L)) 

답변

3

사용하지 마십시오 transform.

df$ratio2 <- with(df,c(NA,tail(actual,-1)/head(value,-1))) 
df$ratio2[seq(1,nrow(df),by = 3)] <- NA 
: 우리는 프레임이 정렬됩니다, 우리는 얼마나 큰 각 그룹 ( id로) 알고 데이터를 가정 할 경우

foo <- function(x){ 
    x$ratio <- c(NA,tail(x$actual,-1)/head(x$value,-1)) 
    x 
} 
> 
> ddply(df,.(id),foo) 
    id value year actual  ratio 
1 1  6 2007  6  NA 
2 1 16 2008  10 1.6666667 
3 1 21 2009  5 0.3125000 
4 2  5 2011  5  NA 
5 2 10 2012  5 1.0000000 
6 2 26 2013  16 1.6000000 
7 3  2 2004  2  NA 
8 3 12 2004  10 5.0000000 
9 3 26 2006  14 1.1666667 
10 4  9 2010  9  NA 
11 4 16 2011  7 0.7777778 
12 4 26 2012  10 0.6250000 
13 5  2 2014  2  NA 
14 5 15 2015  13 6.5000000 
15 5 29 2016  14 0.9333333 

, 우리는 심지어 전체 분할 적용 일을 할 필요가 없습니다

+0

고마워, 조란. 그룹의 크기가 다를 수 있습니다. 그래서, 나는 ddply에 충실 할 것이다. seq 열은 어떻습니까? 세트가 주문되었습니다. – user1100825

+0

'x $ seq <- seq_along (x $ id) - 1'도'foo'에 넣으시겠습니까? – joran

+0

고마워, 조란. 이 일을해야 해. – user1100825