【问题标题】:Create data frame that is mean average of other data frames创建数据框,该数据框是其他数据框的平均值
【发布时间】:2014-11-04 15:55:24
【问题描述】:

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

以下是问题的 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 &lt;- ldply(c(a,b)),但这并不能平均这些值;相反,它使它们相互交错。

【问题讨论】:

  • 因为您提到了几个数据集(在全球环境中),并且显示的示例以frame开头。我使用ls(pattern="^frame") 来获取这些对象。使用mget 将获得存储在该对象中的值的列表。你是说你展示的例子有numeric(0)吗?
  • 抱歉,昨天我的实施很糟糕。我现在已经接受了你的回答。

标签: r dataframe


【解决方案1】:

你可以试试

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

【讨论】:

  • 这行得通。我想知道是否有某种方法可以忽略 NA 值?似乎如果我的任何数据帧包含 NA,则平均值也被计算为 NA。我似乎无法将na.rm=TRUE 参数添加到Reduce() 函数...
  • @CaptainProg 没问题。让我尝试创建一个数据集并进行测试。
  • @CaptainProg 你会在第一列有NAs,即保持固定的列。
  • 否 - 仅在其他列中。
【解决方案2】:

您可以使用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

【讨论】:

    猜你喜欢
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多