我有一个看起来像这样的大数据框
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做这样的事情?
答案 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
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