如何解决按辅助数据框分组
我有两个数据帧,它们的结构类似于示例中的结构:
types=data.frame(t(data.frame(A=sample(c("T1","T2"),20,replace = TRUE),B=sample(c("A","B","C","D"),replace=TRUE))))
num_df=data.frame(replicate(20,sample(0:1,30,rep=TRUE)))
> types
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20
A T2 T2 T2 T1 T1 T2 T2 T1 T1 T2 T2 T2 T1 T1 T1 T2 T1 T1 T1 T2
B A B B C B D D A B D C D A A C C A A D B
> head(num_df)
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20
1 1 1 1 1 0 0 1 1 0 0 0 0 0 1 0 1 1 1 1 1
2 1 1 1 0 1 0 1 0 0 1 1 1 0 1 1 1 1 1 1 1
3 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 1 0 0
4 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 1 0 1 0
5 0 0 1 0 0 1 0 1 1 1 1 1 1 1 1 0 0 0 0 1
6 1 0 0 1 1 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0
“类型”的每个列均指num_df列。 我需要获取另一个数据帧,在其中使用类型中的变量对num_df的列求平均。例如,我想要获取类型为“ T1”和“ A”的num_df所有列的平均值(然后继续进行其他所有组合)。
执行此操作的一种可能方法是使用几个for循环并更改引号中的各个变量,例如:
rowMeans( num_df[,colnames(num_df)[types[1,]=="T1" & types[2,]=="A"] ])
但是我认为有一个更优雅的解决方案。也许使用dplyr? group_by?
有人可以帮忙吗?
解决方法
我不确定这是否有帮助
as.data.frame(
lapply(
split.default(types,do.call(paste,asplit(types,1))),function(v) rowMeans(num_df[names(v)])
)
)
输出类似于
T1.A T1.B T1.C T1.D T2.A T2.B T2.C T2.D
1 1.0000000 0.0 0.8333333 0.3333333 1 1 0.6666667 0
2 0.0000000 0.0 0.6666667 0.3333333 0 0 0.3333333 0
3 0.3333333 0.5 0.6666667 0.6666667 1 0 0.3333333 1
4 0.3333333 0.5 0.3333333 0.3333333 1 0 0.6666667 0
5 0.6666667 0.5 0.5000000 1.0000000 0 1 0.6666667 0
6 0.3333333 0.5 0.3333333 0.3333333 0 0 0.6666667 1
7 0.0000000 1.0 0.5000000 0.3333333 0 1 0.6666667 0
8 0.6666667 0.5 0.8333333 0.6666667 1 0 0.3333333 1
9 0.6666667 0.0 0.6666667 0.6666667 1 0 0.6666667 0
10 0.0000000 0.5 0.3333333 1.0000000 0 1 0.6666667 1
11 0.0000000 0.5 0.5000000 0.0000000 1 1 0.6666667 1
12 0.3333333 0.5 0.1666667 0.6666667 1 1 1.0000000 1
13 0.3333333 0.5 0.3333333 0.6666667 0 0 0.3333333 0
14 1.0000000 0.5 0.5000000 0.6666667 0 1 0.6666667 1
15 0.3333333 0.5 0.3333333 1.0000000 1 1 0.6666667 0
16 0.6666667 0.5 0.8333333 0.0000000 1 0 0.6666667 1
17 0.0000000 0.5 0.3333333 0.0000000 0 1 0.6666667 1
18 0.3333333 0.0 0.3333333 0.6666667 0 0 0.6666667 0
19 0.6666667 1.0 0.5000000 0.3333333 0 0 1.0000000 0
20 0.6666667 1.0 0.5000000 0.3333333 1 0 0.3333333 0
21 1.0000000 0.5 0.1666667 0.6666667 1 1 0.3333333 0
22 0.3333333 0.5 0.1666667 0.6666667 1 1 0.3333333 0
23 0.0000000 0.5 0.5000000 0.6666667 0 0 0.3333333 1
24 1.0000000 0.5 0.3333333 0.0000000 0 1 0.6666667 0
25 1.0000000 0.5 0.6666667 0.3333333 1 0 0.3333333 0
26 0.6666667 0.5 0.3333333 0.3333333 1 0 0.6666667 0
27 0.3333333 0.5 0.3333333 0.6666667 1 1 0.6666667 1
28 0.0000000 1.0 0.6666667 0.6666667 0 0 0.0000000 1
29 0.6666667 0.5 0.5000000 0.3333333 0 0 0.3333333 1
30 0.6666667 0.5 0.6666667 0.3333333 0 0 0.3333333 0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。