我想获取多个数据帧,并将它们合并以产生包含输入数据帧的每一行的平均值的单个数据帧。每个数据框都有一个列,它可以作为锚点。
这是问题的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))
,但这并不是对值的平均值;相反,它将它们相互交叉。
答案 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