如何汇总跨列(包括计算列)的均值?

时间:2019-01-30 19:06:22

标签: r dplyr

我将如何使用dplyr summarize函数来计算所有列的均值,但包括需要原始数据的自定义列的结果呢?

下面是使用msleep数据集的示例。我希望结果是显示平均值的一行,以及我创建的sleep_tot_rem列的正确结果。

library(tidyverse)

# Incorrect calculation for Mutated Column
msleep %>% filter(!is.na(sleep_rem)) %>% mutate(sleep_tot_rem = sleep_total / sleep_rem) %>% 
  summarize_if(is.numeric, mean, na.rm=TRUE)
#> # A tibble: 1 x 7
#>   sleep_total sleep_rem sleep_cycle awake brainwt bodywt sleep_tot_rem
#>         <dbl>     <dbl>       <dbl> <dbl>   <dbl>  <dbl>         <dbl>
#> 1        10.4      1.88       0.440  13.6   0.106   63.3          6.97

# Correct calculation for mutated column
msleep %>% filter(!is.na(sleep_rem)) %>% summarize_if(is.numeric, sum, na.rm=TRUE) %>% 
  mutate(sleep_tot_rem = sleep_total / sleep_rem)
#> # A tibble: 1 x 7
#>   sleep_total sleep_rem sleep_cycle awake brainwt bodywt sleep_tot_rem
#>         <dbl>     <dbl>       <dbl> <dbl>   <dbl>  <dbl>         <dbl>
#> 1        634.      114.        14.1  830.    5.11  3861.          5.54

先谢谢了。

1 个答案:

答案 0 :(得分:2)

问题在于,第一个结果 是对总睡眠与再睡眠的平均比率的正确计算。比率的平均值不太可能与平均值的比率相同。您需要回答的问题是您想要的:平均比率或平均比率。

如果是前者,请使用您的第一个计算,因为您要取计算结果的平均值。如果是后者,请使用第二次计算,因为您要基于平均睡眠时间来计算结果。只要两个度量具有相同的条目数,则总和的比率等于均值的比率(总和只是平均值乘以值的数目,即一个在顶部和底部抵消的常数)。

我们可以在一个简化的示例中看到这一点。如果我们创建两个变量ab

a <- 1:10
b <- 11:20

我们可以看到a:b的平均比例为:

mean(a / b)

0.3312286,而平均比率为:

mean(a) / mean(b)

0.3548387。

这与权重的差异有关。比率的平均值对所有10个值的权重相同,但是平均值的比率受任何异常值的影响更大。如果使用更极端的示例,则更加明显:

x <- c(1:9, 100)
y <- c(2*(1:9), 500)

mean(x / y)
mean(x) / mean(y)

此处,平均比率为0.47,因为100/500 = 0.2的影响相对较小。但是,平均值的比率为0.2458,因为100和500分别对平均值的影响比其他9个值大。