基于共享列值平均数据帧的不同行

时间:2015-08-12 22:58:22

标签: r

我有一个看起来像这样的大数据框

iid Q1  Q2  Q16 Q17 Q18 pop region  bigregion   verbosepop
Sample1 0   0   0   0   0   First   A   br1 Alpha1
Sample2 0   0   0   0   0   First   A   br1 Alpha1
Sample3 0   0   0   0   0   Second  B   br1 Beta
Sample4 0   0   0   0   0   Second  B   br1 Beta
Sample5 0   0   0   0   0   Third   C   br2 Gamma
Sample6 0   0   0   0   0   Fourth  C   br2 Delta
Sample7 0   0   0   0   0   First   A   br1 Alpha2
Sample8 0   0   0   0   0   First   A   br1 Alpha2

这些0代表0到1之间的数字,加起来为1.对于这个大小的表,我可以轻松地手工完成,但我的实际数据框有来自169个人口的2094个样本(iid) (pop)有18个Q列。样本不按人口顺序排序(尽管如果它可以简化编码,我可以对其进行排序)。

对于每个人口,我希望得到所有18个Q列的平均值,所以我可以得到这样的输出:

Q1  Q2  Q16 Q17 Q18 pop region  bigregion
0   0   0   0   0   First   A   br1
0   0   0   0   0   Fourth  C   br2
0   0   0   0   0   Second  B   br1
0   0   0   0   0   Third   C   br2

以及这样的输出(当用verbosepop排序时)

Q1  Q2  Q16 Q17 Q18 pop region  bigregion   verbosepop
0   0   0   0   0   First   A   br1 Alpha1
0   0   0   0   0   First   A   br1 Alpha2
0   0   0   0   0   Second  B   br1 Beta
0   0   0   0   0   Fourth  C   br2 Delta
0   0   0   0   0   Third   C   br2 Gamma

我想知道如何让R做这样的事情?

1 个答案:

答案 0 :(得分:2)

我们可以使用dplyr。我们在group_by中指定分组列,并使用mean获取“Q”列的summarise_each。在matches中,我们可以使用正则表达式模式来匹配列名。在这种情况下,我匹配的列名称以“Q”(^Q)开头,后跟数字(\\d+)。

library(dplyr)
df1 %>% 
      group_by(pop, region, bigregion) %>% 
      summarise_each(funs(mean), matches('^Q\\d+'))
#     pop region bigregion Q1 Q2 Q16 Q17 Q18
#1  First      A       br1  0  0   0   0   0
#2 Fourth      C       br2  0  0   0   0   0
#3 Second      B       br1  0  0   0   0   0
#4  Third      C       br2  0  0   0   0   0

对于第二种情况,我们还需要在group_by

中添加'verbosepop'
df1 %>%
   group_by(pop, region, bigregion, verbosepop) %>%
   summarise_each(funs(mean), matches('^Q\\d+'))
#     pop region bigregion verbosepop Q1 Q2 Q16 Q17 Q18
#1  First      A       br1     Alpha1  0  0   0   0   0
#2  First      A       br1     Alpha2  0  0   0   0   0
#3 Fourth      C       br2      Delta  0  0   0   0   0
#4 Second      B       br1       Beta  0  0   0   0   0
#5  Third      C       br2      Gamma  0  0   0   0   0