R 按辅助数据帧分组
我有两个数据帧,其结构与示例中的结构相似:R 按辅助数据帧分组,r,grouping,R,Grouping,我有两个数据帧,其结构与示例中的结构相似: types=data.frame(t(data.frame(A=sample(c("T1", "T2"), 20, replace = TRUE), B=sample(c("A", "B", "C", "D"), 20, replace=TRUE)))) num_df=data.frame(replicate(20,sample(0
types=data.frame(t(data.frame(A=sample(c("T1", "T2"), 20, replace = TRUE), B=sample(c("A", "B", "C", "D"), 20, 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的列。例如,我想获得num_df的所有列的平均值,其中类型为“T1”和“A”(然后继续计算所有其他组合)
一种可能的方法是使用两个for循环并更改引号中的各种变量,如:
rowMeans( num_df[, colnames(num_df)[types[1,]=="T1" & types[2,]=="A"] ])
但我认为有一个更优雅的解决方案。也许用dplyr?组员
有人能帮忙吗?我不确定这是否有帮助
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
为什么你问了两次这个问题?连接问题,我觉得我的第一次提交不起作用。。。很抱歉我将删除其中一个问题,这是一个非常好的答案。是的,确实有用。只要加上“as.data.frame”,我想我就得到了我想要的结果。然后用rowMeans更改行和。