2017-10-11 2 views
-1

이 데이터 프레임을 2007 년 1 월 열 A에 대해 2007 년 1 월/2007 년 평균에 해당하는 비율 행렬로 변환하려고 시도하면 2007 년 2 월에 4/2007 년 평균 ... 모든 항목에 적용해야합니다. 연간 평균 대비 비율

YearM A B C 
2007/Jan 3 5 7 
2007/Feb 4 5 6 
2007/Mar 4 4 2 
........... 
2013/Dec 4 4 2 

+0

데이터 샘플을 게시하기 위해'dput'을 사용할 수 있습니까? 지금 삽입 한 샘플은 dput 사용법을 알아 낸 – bouncyball

+0

으로 작업하기가 매우 어렵습니다. – jkl

+0

downvote 버튼 – useR

답변

2
library(dplyr) 

avg_mat = df %>% 
    group_by(year = sub("/.*", "", YearM)) %>% 
    mutate_at(vars(A:C), "mean") %>% 
    ungroup() %>% 
    select(A:C) %>% 
    as.matrix() 

mat = df %>% 
    select(A:C) %>% 
    as.matrix() 

cbind(YearM = df$YearM, as.data.frame(mat/avg_mat)) 

결과 :

 YearM   A   B C 
1 2007/Jan 0.8181818 1.0714286 1.4 
2 2007/Feb 1.0909091 1.0714286 1.2 
3 2007/Mar 1.0909091 0.8571429 0.4 
4 2013/Dec 1.0000000 1.0000000 1.0 

데이터 :

df = read.table(text = "YearM A B C 
2007/Jan 3 5 7 
2007/Feb 4 5 6 
2007/Mar 4 4 2 
2013/Dec 4 4 2", header = TRUE) 
+0

아래의 회색 체크 표시를 클릭하여 가장 유용한 답을 수락하는 것을 잊지 마십시오! 날짜/월을 출력 행렬에 다시 추가하는 방법은 무엇입니까? – jkl

+0

@jkl 물론, 내 업데이 트를 참조하십시오. 'YearM'을 추가하려면 행렬을 data.frame으로 변환해야합니다. 그렇지 않으면 숫자로 강제 변환됩니다. – useR

0

가 여기에 sapplyave 기능을 사용하여 다른 방법입니다. 에서 ave 부분을 빌려 왔습니다.

df$year <- year = sub("/.*", "", df$YearM)  
df[,c('A','B','C')] <- df[,c('A','B','C')]/sapply(df[,c('A','B','C')], ave, df$year) 


    YearM   A   B C year 
1 2007/Jan 0.8181818 1.0714286 1.4 2007 
2 2007/Feb 1.0909091 1.0714286 1.2 2007 
3 2007/Mar 1.0909091 0.8571429 0.4 2007 
4 2013/Dec 1.0000000 1.0000000 1.0 2013