2017-10-11 5 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部分はthis postから借りています。

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 
関連する問題