2017-11-16 4 views
0

私は、各教室の男性と女性の平均スコア差の変数を作成していました。クラスidは各教室を表します。性別は各生徒のためのもので、最後の列は彼らの得点です。データセット内の既存の変数を使用した変数の作成

私は、各教室の平均の差の値(female(1)-male(0))を持っていたいと思います。

私のデータは次のようになります。任意の考え

> data 
      class id mean score 
[1,]  1    3 
[2,]  2   -3 
[3,]  3   1.5 

:私はそれのようなものである必要が

data <- matrix(c(1,1,1,1,2,2,2,2,3,3,3,3, 
       0,1,1,0,1,0,0,1,0,1,1,0, 
       20,25,22,21,30,35,32,31,40,45,42,44), 
       nrow=12, 
       ncol=3) 
colnames(data) <- c("class id","gender","score") 

> data 
     class id gender score 
[1,]  1   0 20 
[2,]  1   1 25 
[3,]  1   1 22 
[4,]  1   0 21 
[5,]  2   1 30 
[6,]  2   0 35 
[7,]  2   0 32 
[8,]  2   1 31 
[9,]  3   0 40 
[10,]  3  1 45 
[11,]  3  1 42 
[12,]  3  0 44 

ありがとうございます!ここで

+0

なぜこのような計算にdata.tableを使用しないのですか?グループサポートはあなたを助けます。 – MKR

答えて

1

はあなたの入力データを変換することによって開始するようtidyverse機能tibbleまたはdata.frameでの作業

library(tidyverse) 
data %>% as_tibble %>% 
    group_by(`class id`, gender) %>% 
    summarize(mean=mean(score)) %>% 
    spread(gender, mean) %>% 
    mutate(mean_score=`1`-`0`) %>% 
    select(`class id`, mean_score) 

を使用するソリューションは、マトリックスよりもはるかに簡単であるのです。次に、性別ごとの平均を計算します。それから私たちはそれを広げて、各クラスの同じレコードの各性別の価値を持っています。それでは差を取るだけです。この例では、奇妙な列名のためにバックティックに注意してください。

別の方法としては、整形を回避し、この

data %>% as_tibble %>% 
    group_by(`class id`) %>% 
    summarize(mean_score=mean(score[gender==1]) - mean(score[gender==0])) 

ような何かを行うことができます。

+0

これは素晴らしい動作します。アドバイスありがとうございます。 – amisos55

関連する問題