【问题标题】:Find Mean in Each Group在每个组中找到平均值
【发布时间】:2017-08-29 23:03:07
【问题描述】:

在每个组中,我想找到两个子组的平均值。为了清楚起见,数据如下所示:

Group Val1 Val2 Val3
1     50   0.03  50.1
1     50.2 0.05  50.1
2     50.3 0.01  50.1
1     50   0.03  50.2
1     50.1 0.04  50.2
1     50   0.01  50.3
1     50   0.02  50.3
2     50.3 0.03  50.3

在 Val3 的每个组中,我想计算第 1 组中 Val2 的平均值和第 2 组中 Val2 的平均值。在某些情况下,对于 Val3,第 2 组中没有成员。这是我尝试的代码.

fileB.mean.dat <- tapply(combined.sorted.data[combined.sorted.data[,1] == 2,3], combined.sorted.data[combined.sorted.data[,1] == 2,4], mean)

我不知道如何在上面的代码中包含来检查是否有组 2 的成员,如果没有,则使 Val 3 的平均值为 0。换句话说,应该有一个代表 Group 的平均值Val 3 的每个值对应 1 和 2。

【问题讨论】:

  • aggregate(Val2 ~ Group + Val3, data = df, mean) 将给出每组的平均值。但不会给你“缺失”的平均值(而且我不完全确定对不存在的数据使用平均值的好处?)
  • 我想绘制数据。因此,我希望在图中显示平均值(即使缺失数据的平均值为 0)。
  • 缺失数据的均值为零仍然具有误导性。
  • 您可以使用tidyr::complete 插入缺少的组合,例如library(tidyverse); df %&gt;% complete(Group, Val3) %&gt;% group_by(Group, Val3) %&gt;% summarise_all(mean)

标签: r dataframe data-processing


【解决方案1】:

您可以使用dcast of reshape2SymbolixAU's answer 的输出转换为您喜欢的。

library(reshape2)
dcast(data = aggregate(Val2 ~ Group + Val3, data = df, mean),
      formula = Group~Val3,
      value.var = "Val2")
#  Group 50.1  50.2  50.3
#1     1 0.04 0.035 0.015
#2     2 0.01    NA 0.030

或者您也可以在基础 R 中执行此操作,但会相对更复杂

sapply(split(df[c("Group", "Val2")], df$Val3),
       function(a) sapply(unique(df$Group),
            function(x) setNames(mean(a$Val2[a$Group == x]), x)))
#  50.1  50.2  50.3
#1 0.04 0.035 0.015
#2 0.01   NaN 0.030

数据

df = structure(list(Group = c(1, 1, 5, 1, 1, 1, 1, 5), Val1 = c(50, 
50.2, 50.3, 50, 50.1, 50, 50, 50.3), Val2 = c(0.03, 0.05, 0.01, 
0.03, 0.04, 0.01, 0.02, 0.03), Val3 = c(50.1, 50.1, 50.1, 50.2, 
50.2, 50.3, 50.3, 50.3)), .Names = c("Group", "Val1", "Val2", 
"Val3"), row.names = c(NA, -8L), class = "data.frame")

【讨论】:

    【解决方案2】:

    我们可以使用tidyverse

    library(tidyverse)
    df %>% 
       group_by(Group, Val3) %>%
       summarise(Val2 = mean(Val2)) %>% 
       spread(Val3, Val2)
    # A tibble: 2 x 4
    # Groups:   Group [2]
    #   Group `50.1` `50.2` `50.3`
    #* <dbl>  <dbl>  <dbl>  <dbl>
    #1     1   0.04  0.035  0.015
    #2     2   0.01     NA  0.030
    

    【讨论】:

    • 这给出了以下错误:“overscope_eval_next(overscope, expr) 中的错误:找不到对象 'Val3'”。你知道为什么吗?
    • @user2657817 我又试了一次,没有发现任何错误。你能检查一下列名吗?可能有一些尾随空格。我用dplyr_0.7.4
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2021-11-08
    相关资源
    最近更新 更多