2016-07-19 1 views
2

모든 지연 시차는 연속 시계열을 사용합니다. 나는 해마다 변화율을 계산하려고 노력하고 있지만, 중간에 틈이 있는지 계산하는 것은 의미가 없습니다. 즉, 나는 2001 년에서 2004 년까지 퍼센트 변화를 원하지 않을 것입니다. 단지 2 년 사이에 관심이 있습니다. 데이터 입력의 예 :연도 차이가있는 래그 함수를 사용하여 변경 계산 R

structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
    Year = c(2000L, 2001L, 2004L, 2005L, 2006L, 2007L, 1990L, 
    2000L, 2001L, 2005L, 2006L, 2007L, 2009L), Value = c(4L, 
    10L, 7L, 4L, 7L, 5L, 2L, 7L, 10L, 6L, 9L, 2L, 9L)), .Names = c("ID", 
"Year", "Value"), class = "data.frame", row.names = c(NA, -13L 
)) 

df <- df %>% group_by(ID) %>% 
    mutate(delta = (Value-lag(Value))/lag(Value)) 

위의 줄은 점프하는 장소를 무시하고 원하는 출력을 반환하지 않습니다. 원하는 출력 : 여기

structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L), .Label = c("A", "B"), class = "factor"), 
    Year = c(2000L, 2001L, 2004L, 2005L, 2006L, 2007L, 1990L, 
    2000L, 2001L, 2005L, 2006L, 2007L, 2009L), Value = c(4L, 
    10L, 7L, 4L, 7L, 5L, 2L, 7L, 10L, 6L, 9L, 2L, 9L), Change = c(NA, 
    1.5, NA, -0.428571429, 0.75, -0.285714286, NA, 2.5, 0.428571429, 
    NA, 0.5, -0.777777778, NA)), .Names = c("ID", "Year", "Value", 
"Change"), class = "data.frame", row.names = c(NA, -13L)) 
+0

데이터 집합이 얼마나 큰을 얻을 수 base R 기능을 사용할 수 있습니까? –

+0

수천 개의 행. – hhhaaa1

답변

4

: 여기

df %>% group_by(ID) %>% 
    mutate(delta = ifelse((Year - lag(Year)) > 1, NA, (Value-lag(Value))/lag(Value))) 
3

data.table 용액이다

# load library and convert to data.table 
library(data.table) 
setDT(df) 

df[, "Change" := ifelse(Year-shift(Year)==1, 
    (Value-shift(Value))/shift(Value), NA), by="ID"] 

이는 거대한 데이터 세트로 느릴 수 ifelse 사용

df 
    ID Year Value  Change 
1: A 2000  4   NA 
2: A 2001 10 1.5000000 
3: A 2004  7   NA 
4: A 2005  4 -0.4285714 
5: A 2006  7 0.7500000 
6: A 2007  5 -0.2857143 
7: B 1990  2   NA 
8: B 2000  7   NA 
9: B 2001 10 0.4285714 
10: B 2005  6   NA 
11: B 2006  9 0.5000000 
12: B 2007  2 -0.7777778 
13: B 2009  9   NA 

을 반환하지만 데이터 만약 세트가 관측 크기의 수천에있다, 이것은 눈에 띄지 않을 것이다. dplyr를 사용

3

diff 기능을 이용 가능한 솔루션.

library(dplyr) 
df <- df %>% group_by(ID) %>% 
    mutate(delta = (Value-lag(Value))/lag(Value)) 

#find the difference between each row 
yeardiff<-c(0,diff(df$Year)) 
#for any row with a difference not equal to one set to NA 
df$delta[yeardiff !=1]<-NA 
1

우리는 단지 출력

lv <- with(df, ave(Value, ID, FUN = function(x) c(NA, x[-length(x)]))) 
ly <- with(df, ave(Year, ID, FUN = function(x) c(NA, x[-length(x)]))) 
df$Change <- with(df, ifelse((Year -ly) >1, NA, (Value - lv)/lv)) 
df$Change 
#[1]   NA 1.5000000   NA -0.4285714 0.7500000 
#[6] -0.2857143   NA   NA 0.4285714   NA 
#[11] 0.5000000 -0.7777778   NA