我想通过将数据帧与参考数据集进行比较来计算平均值。
在下面的示例中,df1是参考数据帧,其中df1 $ ID是df2的列名。我想为相应的df1 $ Ref中的每个重复值计算平均值df2。
df1 <- data.frame("ID" = paste("R",1:7,sep = "_"), "Ref" = rep(c("A","B","C","D"),c(2,2,1,2)))
df2 <- data.frame("G.Na" = paste("Neo",1:5,sep = "."), "R_1" = 10:14, "R_2"= 1:5,
"R_3"= 2:6,"R_4"= 7:11, "R_5"= 0.2:0.6,"R_6"= 9:13,"R_7" = 23:27)
result <- data.frame("G.Na" = paste("Neo",1:5,sep = "."), "R_1" = 5.5:9.5, "R_3"= 4.5:8.5,
"R_5"= 0.2:0.6,"R_6"= 16:20)
答案 0 :(得分:1)
假定df1$ID
与df2
中的列名顺序相同。我们可以使用split.default
根据df1$Ref
中的级别拆分列,然后使用rowMeans
为每个组计算sapply
。
cbind(df2[1], sapply(split.default(df2[-1], df1$Ref), rowMeans))
# G.Na A B C D
#1 Neo.1 5.5 4.5 0.2 16
#2 Neo.2 6.5 5.5 0.2 17
#3 Neo.3 7.5 6.5 0.2 18
#4 Neo.4 8.5 7.5 0.2 19
#5 Neo.5 9.5 8.5 0.2 20
如果它们的顺序不同,我们可能需要先match
它们
cbind(df2[1], sapply(split.default(df2[-1],
df1$Ref[match(names(df2)[-1], df1$ID)]), rowMeans))
答案 1 :(得分:1)
我们可以使用base R
本身在split
中进行此操作。请注意,这还将采用任何顺序的列名
cbind(df2[1], sapply(split(df1$ID, df1$Ref),
function(x) rowMeans(df2[as.character(x)])))
# G.Na A B C D
#1 Neo.1 5.5 4.5 0.2 16
#2 Neo.2 6.5 5.5 0.2 17
#3 Neo.3 7.5 6.5 0.2 18
#4 Neo.4 8.5 7.5 0.2 19
#5 Neo.5 9.5 8.5 0.2 20