计算比较参考数据集的重复列的平均值

时间:2019-08-29 09:00:17

标签: r dplyr data.table

我想通过将数据帧与参考数据集进行比较来计算平均值。

在下面的示例中,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)

2 个答案:

答案 0 :(得分:1)

假定df1$IDdf2中的列名顺序相同。我们可以使用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