创建数据帧,该数据帧是其他数据帧的平均值

时间:2014-11-04 15:55:25

标签: r dataframe

我想获取多个数据帧,并将它们合并以产生包含输入数据帧的每一行的平均值的单个数据帧。每个数据框都有一个列,它可以作为锚点。

这是问题的MWE,以两个输入数据帧为例:

frame_a <- data.frame(column_a = c(1,3,5,7), column_b = c(6,3,4,1))
frame_b <- data.frame(column_a  = c(1,3,5,7), column_b  = c(2,4,6,1))

我想使用frame_c作为锚定“公共”列,生成一个新的数据框column_a。输出应包含以下值:

column_a  column_b 
       1       4
       3       3.5
       5       5
       7       1

我尝试过使用frame_c <- ldply(c(a,b)),但这并不是对值的平均值;相反,它将它们相互交叉。

2 个答案:

答案 0 :(得分:2)

可能你可以试试

lst <- mget(ls(pattern="^frame"))
Reduce(`+`, lst)/length(lst)
#    column_a column_b
#1        1      4.0
#2        3      3.5
#3        5      5.0
#4        7      1.0

更新

如果其他列中有NAs,例如

frame_a <- data.frame(column_a = c(1,3,5,7), column_b = c(NA,3,4,1))
frame_b <- data.frame(column_a  = c(1,3,5,7), column_b  = c(2,4,NA,1))
lst <- mget(ls(pattern="^frame"))
setNames(as.data.frame(`dim<-`(rowMeans(do.call(cbind,lapply(lst,
          c, recursive=TRUE)), na.rm=TRUE), dim(lst[[1]]))), colnames(lst[[1]]))
#   column_a column_b
#1        1      2.0
#2        3      3.5
#3        5      4.0
#4        7      1.0

或者

library(abind)
as.data.frame(apply(abind(lst, along=3), c(1,2), mean, na.rm=TRUE))
#   column_a column_b
#1        1      2.0
#2        3      3.5
#3        5      4.0
#4        7      1.0

答案 1 :(得分:0)

您可以使用dplyr

执行此操作
library(dplyr)

frame_a %>% 
  left_join(frame_b, by="column_a") %>%              # Merge the two data frames
  rename(col_b1=column_b.x, col_b2=column_b.y) %>%   # Shorten column names
  rowwise() %>%                                      # Do the following row-wise
  mutate(mean_b=mean(c(col_b1,col_b2))) %>%          # Calculate mean of "b" columns 
  select(column_a, mean_b)                           # Keep only the columns we want

  column_a mean_b
1        1    4.0
2        3    3.5
3        5    5.0
4        7    1.0
相关问题