【问题标题】:Calculating an average using tidyverse使用 tidyverse 计算平均值
【发布时间】:2019-11-26 14:13:51
【问题描述】:

在尝试创建包含平均值的新列时,我得到了一个奇怪的结果。我想知道是否有人可以解释结果。

这段代码说明了我的问题:

library(tidyverse)
df <- data.frame(year = c(2010, 2010, 2011, 2011, 2011),
             cases = c(10:14), 
             disease = c("A","B","A","B","C"))

df %>% 
   spread(year, cases, fill = 0) %>% 
   mutate(average = sum(`2010`, `2011`)/2) 

我得到以下结果:

为什么我的平均列满是 30 条?我在这里没有看到什么?

【问题讨论】:

  • 您必须在两行之间包含rowwise() %&gt;% 或使用mutate(average = (2010` + 2011)/2)` 或先计算然后传播df %&gt;% group_by(disease) %&gt;% mutate(average = sum(cases)/2) %&gt;% spread(year, cases, fill = 0)
  • 非常感谢@Roman - 效果很好。非常感谢。

标签: r tidyverse


【解决方案1】:

如果您添加group_by,您将获得您期望的结果。因此,我假设您的 mutate 函数执行完整数据集的总和,而不是针对每个条件执行此操作。 (正如@Roman 提到的,rowwise 也应该有效)。

df %>% 
  spread(year, cases, fill = 0) %>% 
  group_by(disease) %>%
  mutate(average = sum(`2010`, `2011`)/2)

# A tibble: 3 x 4
# Groups:   disease [3]
  disease `2010` `2011` average
  <fct>    <dbl>  <dbl>   <dbl>
1 A           10     12      11
2 B           11     13      12
3 C            0     14       7

【讨论】:

  • 非常感谢@dc37
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 2012-06-19
相关资源
最近更新 更多