【问题标题】:How can I calculate mean and sd by group and format as dataframe?如何按组计算平均值和标准差并将其格式化为数据框?
【发布时间】:2021-03-08 19:15:13
【问题描述】:

我的数据目前是df1的格式:

outcome <- c("success", "failure", "success", "failure", "success", "failure")
basketball <- c(10, 7, 7, 8, 9, 10)
soccer <- c(8, 21, 30,  21, 6, 10)
football <- c(9,  2,  1, 3, 1, 5)

df1 <-  data.frame(outcome, basketball, soccer, football)

我希望它采用 df2 格式,这样我可以更轻松地使用 ggplot2 创建条形图。

symptom <-  c("basketball",  "basketball", "soccer", "soccer", "football", "football")
mean <-  c(10, 6, 9, 7, 3, 1)
sd <-  c(1, 2, 1, 3, 0.5, 0.2)

df2 <- data.frame(outcome, symptom, mean, sd)

目前我有很多代码可以让我以一种迂回的方式到达那里,但我觉得必须有一种简化的方式来用几行代码来做到这一点。有没有办法使用 dplyr 或 tidyr 动词来使用它?

谢谢!

【问题讨论】:

  • 是 'mean', 'sd' 中的值基于输入数据

标签: r dplyr tidyr


【解决方案1】:

我们可以用pivot_longer重新整形为'long'格式,然后进行分组操作

library(dplyr)
library(tidyr)
df1 %>%
  pivot_longer(cols = basketball:football, names_to = 'symptom') %>% 
  group_by(outcome, symptom) %>%
  summarise(mean = mean(value), sd = sd(value), .groups = 'drop')

如果我们还需要绘图

library(ggplot2)
df1 %>%
  pivot_longer(cols = basketball:football, names_to = 'symptom') %>% 
  group_by(outcome, symptom) %>% 
  summarise(mean = mean(value), sd = sd(value), .groups = 'drop') %>%
  ggplot(aes(x = outcome, y = mean, fill = symptom)) + 
    geom_bar(position = position_dodge(), stat = 'identity') + 
    geom_errorbar(aes(ymin = mean - sd, ymax = mean + sd),
            width = .2, position = position_dodge(.9))

【讨论】:

  • 谢谢阿克伦。所以你没有在这个场景中的pivot_longer 中定义values_to。它是自动创建的吗? `.groups = 'drop'`` 是为了什么。提前谢谢!
  • @TarJae 在 Op 的预期中,它是汇总列“mean”或“sd”,它不关心“value”列的名称。所以,我没有指定values_to,默认情况下将被命名为“值”,而“names_to”被称为“症状”(默认情况下是“名称”列)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
相关资源
最近更新 更多