2016-06-29 5 views
0

私は2列のPCT1とPCT2を持つデータフレーム "d"を持っています。私は各グループの重み付きPCT1とPCT2をプロットしたいと思います。これは、各グループの重み付けされたpct1および重み付けpct2を計算することを要求する:複数のマージを使用することは避けられますか?

(1)現在、私はdplyrを使用して2つの呼び出しでこれをやっています (2)次に2つの結果をrbind()とマージしています

dplyrを2回呼び出しても結果データフレームを生成しないようにする方法はありますか?実際に私は10列ではない2を持っていると私は10回dplyr呼び出し、ような何かしなければならないでしょう:

rbind(PCT1,PCT2,PCT3,PCT4, PCT5, ....,PCT10) 

、ありがとうございました。

d= data.frame (group =c("A","A","B","B"), 
      PCT1 = c(100,50,100,50), 
      PCT2 = c(50,1,10,5), 
      weight = c(99,1, 100,100)) 
d 

    group PCT1 PCT2 weight 
1  A 100 50  99 
2  A 50 1  1 
3  B 100 10 100 
4  B 50 5 100 

PCT1 = d %>% group_by(group) %>% summarise(vmean = weighted.mean(PCT1, weight)) 
PCT1$PCT =1 
PCT2 = d %>% group_by(group) %>% summarise(vmean = weighted.mean(PCT2, weight)) 
PCT2$PCT =2 
result = rbind(PCT1, PCT2) 

あなただけの、さらにあなたのデータフレームを溶融するために必要な結果

group vmean PCT 
1  A 99.50 1 
2  B 75.00 1 
3  A 49.51 2 
4  B 7.50 2 

答えて

3

library(dplyr) 
library(tidyr) 

d <- data.frame (group =c("A","A","B","B"), 
          PCT1 = c(100,50,100,50), 
          PCT2 = c(50,1,10,5), 
          weight = c(99,1, 100,100)) 

d %>% 
    gather(key = PCT_GRP,value = PCT,PCT1:PCT2) %>% 
    group_by(group,PCT_GRP) %>% 
    summarise(vmean = weighted.mean(PCT,weight)) 
+0

である私は、コンソールtidyrインストールしようとすると、最後のメッセージを単に失うURL:https://cran.rstudio.com/bin/windows/contrib/3.2/tidyr_0.5.1.zip ' コンテンツタイプ' application/zip 'の長さ789503バイト(770 KB) ダウンロード済み770 KB – user3022875

+0

@ user3022875別のCRANミラーを試してみてください。それ以外の場合は、インターネット接続に問題があるようです。 – joran

1

別のオプションは、data.table

library(data.table) 
melt(setDT(d), measure = c("PCT1", "PCT2"), variable.name = "PCT_GRP")[, 
     .(vmean = weighted.mean(value, weight)) , .(group, PCT_GRP)] 
# group PCT_GRP vmean 
#1:  A PCT1 99.50 
#2:  B PCT1 75.00 
#3:  A PCT2 49.51 
#4:  B PCT2 7.50 
関連する問題