2017-08-22 4 views
0

私は加重平均からなる要約統計量の表をまとめてより良い、より速い方法を見つけようとしています。要約するためにdplyrを使用し、次にbind_rowsを使用して、私はこのような表になります。これらの数値は単純な平均です。平均は各グループの各要因について計算されます。加重スコアのdata.frameをより速く作成する方法はありますか?

DATAFRAME:au.scores

  AU AUDIT  CORC  GOV  PPS  TMSC TRAIN 
1 Group1 2.833333 2.000000 2.733333 2.000000 1.750000 2.333333 
2 Group2 2.833333 0.000000 2.733333 2.000000 1.750000 2.333333 
3 Group3 1.833333 2.533333 2.466667 2.000000 2.500000 2.166667 
4 Group4 3.000000 2.733333 2.200000 2.666667 1.583333 2.666667 
5 Group5 2.625000 1.816667 2.533333 2.166667 1.895833 2.375000 
これに続い

I 3と各変数の要素とグループ1 & 2を組み合わせた加重スコアを導出する必要がある、4、5、すなわちOverall.Group1 Group1 + Group4 + Group5、Group2はGroup2 + Group4 + Group5、Group3はGroup3 + Group4 + Group5要因です。

group1.overall <- data.frame(
    group1.gov = (au.scores[3, 4] * .30) * .33 + (au.scores[1, 4] * .30) * .33 + 
    (au.scores[2, 4] * .30) * .33, 
    group1.corc = (au.scores[3, 3] * .30) * .33 + (au.scores[1, 3] * .1) * .33 + 
    (au.scores[2, 3] * .1) * .33, 
    group1.tmsc = (au.scores[3, 6] * .30) * .33 + (au.scores[1, 6] * .30) * .33 + 
    (au.scores[2, 6] * .30) * .33, 
    group1.audit = (au.scores[3, 2] * .30) * .33 + (au.scores[1, 2] * .30) * .33 + 
    (au.scores[2, 2] * .30) * .33, 
    group1.pps = (au.scores[3, 5] * .30) * .33 + (au.scores[1, 5] * .30) * .33 + 
    (au.scores[2, 5] * .30) * .33, 
    group1.train = (au.scores[3, 7] * .30) * .33 + (au.scores[1, 7] * .30) * .33 + 
    (au.scores[2, 7] * .30) * .33 
) 

group1.gov group1.corc group1.tmsc group1.audit group1.pps group1.train 
1 0.7854 0.3168 0.594 0.7425 0.594 0.6765 

質問 は、全体的なスコアのdata.frameを作成するための迅速な方法があります生成しますか?

何かOverall.Group1はグループ1 + GROUP4 + GROUP5あるなど

+0

あなたは 'data.table'を試しましたか?それはかなり速く(data.frameよりはるかに速い) –

答えて

1

Group_Num/Gov/Corc/Tmsc/Audit/PPS/Train/Overall 
Group1/0.78/0.31/0.59/0.74/0.59/0.67/<- sum these 
Group2/0.66/0.23/0.44/0.66/0.22/0.43/<- sum these 
Group3/0.12/0.55/0.22/0.33/0.11/0.55/<- sum these 

など、グループ2はグループ2 + GROUP4 + GROUP5 及びグループ3はグループ3 + GROUP4 + GROUP5因子です。グループ1グループ2 + +グループ3の代わりに - どのように計算されるか、全体的なスコアの

あなたの説明は<グループ1を使用していますgroup1.overallためのあなたの式とは異なります。以下のアプローチでは、私はその説明に行きます。

機能を要約内のベクトルの順序の重要性とは何ですか:

library(dplyr); library(tidyr); library(tibble) 

# read in au.scores data frame 
au.scores <- read.table(text = "AU AUDIT  CORC  GOV  PPS  TMSC TRAIN 
Group1 2.833333 2.000000 2.733333 2.000000 1.750000 2.333333 
Group2 2.833333 0.000000 2.733333 2.000000 1.750000 2.333333 
Group3 1.833333 2.533333 2.466667 2.000000 2.500000 2.166667 
Group4 3.000000 2.733333 2.200000 2.666667 1.583333 2.666667 
Group5 2.625000 1.816667 2.533333 2.166667 1.895833 2.375000", header = T) 

# create table of weights (these are dummy weights since there's insufficient details in the question) 
weight.table <- tribble(
    ~AU, ~GOV, ~CORC, ~TMSC, ~AUDIT, ~PPS, ~TRAIN, 
    "Group1",.30,.10,.30,.30,.30,.30, 
    "Group2",.30,.10,.30,.30,.30,.30, 
    "Group3",.30,.10,.30,.30,.30,.30, 
    "Group4",.30,.30,.30,.30,.30,.30, 
    "Group5",.30,.10,.30,.30,.30,.30 
) 

# arrange columns in au.scores to match order of columns in weight.table 
au.scores <- au.scores %>% arrange(AU, GOV, CORC, TMSC, AUDIT, PPS, TRAIN) 

# calculate weighted scores 
au.scores.weighted <- au.scores[,-1] * weight.table[,-1] 
au.scores.weighted$AU <- au.scores$AU 

# calculate scores for each group 
au.scores.weighted <- au.scores.weighted %>% 
    gather(category, weighted.score, -AU) %>% 
    group_by(category) %>% 
    arrange(AU) %>% 
    summarise(group1 = weighted.mean(weighted.score, c(1,0,0,1,1)) * 3 * 0.33, 
      group2 = weighted.mean(weighted.score, c(0,1,0,1,1)) * 3 * 0.33, 
      group3 = weighted.mean(weighted.score, c(0,0,1,1,1)) * 3 * 0.33) %>% 
    ungroup() 

# rearrange result & calculate overall sum for each group 
au.scores.weighted <- au.scores.weighted %>% 
    gather(group, score, -category) %>% 
    spread(category, score) %>% 
    select(group, GOV, CORC, TMSC, AUDIT, PPS, TRAIN) %>% 
    mutate(Overall = GOV + CORC + TMSC + AUDIT + PPS + TRAIN) 

# A tibble: 3 × 8 
    group  GOV CORC  TMSC AUDIT  PPS  TRAIN Overall 
    <chr>  <dbl> <dbl>  <dbl> <dbl>  <dbl>  <dbl> <dbl> 
1 group1 0.7391999 0.39655 0.5176874 0.837375 0.6765001 0.7301250 3.897437 
2 group2 0.7391999 0.33055 0.5176874 0.837375 0.6765001 0.7301250 3.831437 
3 group3 0.7128000 0.41415 0.5919374 0.738375 0.6765001 0.7136251 3.847388 

編集 OPの質問に基づいてコードの説明を追加する:あなたは、必要に応じて、その微調整ができますか? (0,0,1,1,1))* 3 * 0.33 & &c(0,1,0,1,1))* 3 * 0.33 & & c(0,0,1,1,1) ))?

以前のステップが既に順にグループを配置し、各カテゴリ内で、そうweighted.mean関数における重みc(1, 0, 0, 1, 1)を使用してグループ1、4の平均を計算することと等価である、& 5、まったくグループ2 & 3を使用せず。 (0,0,1,1,1)=グループ3、4、&の平均5.各グループを指定するよりも読み取り/エラーチェックが容易であることが分かります手動でグループ番号をテキストの束にすばやく埋め込むことができます。

このようにして得られた平均は1/3が繰り返し分数であるため、10進法では(グループの合計)/ 3、または(グループの合計)* 0.3333333333333333 ...と等価です。元の数式では(グループの合計)* 0.33(小数点第2位を四捨五入)を使用しているため、平均を* 3 * 0.33に掛けても同じ結果が得られます。より正確な結果を望む場合は、* 3 * 0.33部分を完全に除外することができます。

+0

要約関数のベクトルの順序の重要性は何ですか? * 3 * 0.33 && c(0,1,0,1,1))* 3 * 0.33 && c(0,0,1,1,1))?これまでのところ、これは素晴らしく見えます。私はそれが応答するまでにはとても時間がかかることをお詫びします。それは体重の引数のように見えますが、体重は表(weight.table)に指定されていると思いますか? – Zach

+0

それは素晴らしいです。私はコード内でどのように実装されているかを完全に理解しています。私はまだそれがどのように働くのか正確に私の心を歩いています。 :) <熱狂的な拍手と親指>私はそれを考えなかったでしょう。 – Zach

+0

ファンキーな組み合わせなしでグループ4とグループ5を独立させたい場合は、ベクトルをc(0、0、0、0、1、0)とc(0、0、0、0、1 )、その後、残りの部分を実行しますか? – Zach

関連する問題