2017-02-10 2 views
0

기존 변수의 특정 값에서 파생 된 새 변수를 만들고 싶습니다. 내 데이터 프레임은 다음과 같이 보입니다 :특정 관측에 의한 데이터 그룹화 R

year <- c("2010", "2011", "2012", "2013", "2014", "2015") 
x <- c(2980, 2955, 3110, 2962, 2566, 3788) 
y <- c(2453, 2919, 2930, 2864, 2873, 3031) 
df <- data.frame(year, x, y) 

이보다 구체적으로는, 나는 세 번째 열, z을 만들려면을, 그 xy의 비율이다. 그러나 나는이 비율을 x에 의해 y으로 나누어 각 개인의 연도별로 생성하고 싶지 않습니다. 대신 2015 년 (및 2014 년 등)의 가치를 지난 3 년 (즉, 2014 년, 2013 년, 2012 년)의 평균 비율로 유지하려고합니다.

위컴의 dplyr 패키지를 살펴본 결과 특히, group_by 함수이지만, 그 자체로 해를 기준으로 내 데이터를 그룹화하고 싶지는 않으므로 위에 묘사 된대로 (희망에 따라) 3 년이 지난 것입니다.

+2

원시 비율을 계산하고 그런 다음 [롤링 평균] (http://stackoverflow.com/search?q=%5Br%5D+rolling+average)을 수행하십시오. 1 년에 데이터 포인트가 하나만있는 경우 그룹화가 필요하지 않습니다. – Gregor

답변

0

대답은 올바른 트랙에 있습니다,하지만 그들은 그들 오류 "하나 OFF"의 몇 가지있다. 첫째, 당신이 실제로 zoo::rollmeanr(..., na.pad=TRUE)을 할 것입니다 왼쪽에 NA 제대로 패드 출력 :

두 번째 "해제 하나"오류는 데이터의 나머지 부분이 벡터의 정렬에서 발생
> zoo::rollmeanr(df$x/df$y, 3, na.pad=TRUE) 
[1]  NA  NA 1.0962018 1.0359948 0.9962648 1.0590378 

. 설명을 통해 2015 년의 가치를 2014 년, 2013 년 및 2012 년의 평균으로 설정하려고합니다. 그러나 위의 벡터를 표에 추가하면 2015 년의 가치는 2015 년, 2014 년 및 2013 년의 평균으로 계산됩니다. . 함께 dplyr 표기법을 사용하여

> c(NA, zoo::rollmeanr(head(df$x/df$y,-1), 3, na.pad=TRUE)) 
[1]  NA  NA  NA 1.0962018 1.0359948 0.9962648 

이 모든 퍼팅 : 당신이 보상하기 위해 롤링 평균에 입력의 마지막 값을 생략하고, NA 앞에 추가하려면, 수정하려면

df %>% mutate(z = c(NA, zoo::rollmeanr(head(x/y,-1), 3, na.pad=TRUE))) 
    year x y   z 
1 2010 2980 2453  NA 
2 2011 2955 2919  NA 
3 2012 3110 2930  NA 
4 2013 2962 2864 1.0962018 
5 2014 2566 2873 1.0359948 
6 2015 3788 3031 0.9962648 
+0

또는이 변형 :'library (zoo); transform (df, z = rollapplyr (x/y, list (-seq (3)), mean, fill = NA))' –

0
df$z<-0 
for (i in 4:6){ 
    df$z[i]<-mean(df$x[(i-3):(i-1)])/mean(df$y[(i-3):(i-1)]) 
} 

성령 강림절을 루프, 당신이 얻을 수와

year x y  z 
1 2010 2980 2453 0.000000 
2 2011 2955 2919 0.000000 
3 2012 3110 2930 0.000000 
4 2013 2962 2864 1.089497 
5 2014 2566 2873 1.036038 
6 2015 3788 3031 0.996654 
1

dplyr 및 library(zoo) :

df_fin<- df %>% mutate(z = rollmeanr(x/y,3,na.pad=TRUE)) 

내가 열 z는 당신이 원하는 그러나 그것은 좋은 것입니다 무슨 생각 원하는 출력을가집니다. zoo::rollmean를 사용

+1

양쪽 끝에 'NA'가 붙어 "off by 1"오류가 발생하기 때문에 약간 잘못된 것입니다. 'rollmeanr'을 사용하여 패딩 오른쪽의 값을 정렬합니다. –

+2

spacesimprovreadability –

+0

Gotitedited. 미안해! 알았어 @ 리치 스크롤. – thisisrg

0
library(zoo) 
library(dplyr) 

df %>% mutate(z = x/y, zz = rollmean(z, 3, fill = NA) 
+0

귀하의 대답이 원래의 질문을 해결하는 방법을 명확하게 설명하십시오. –