【问题标题】:summarizing variables with similar but not identical x-values汇总具有相似但不相同 x 值的变量
【发布时间】:2020-04-15 16:36:39
【问题描述】:

我有一个包含三个重复的数据集。我想为每个 X 变量绘制平均 Y 变量。但是,我的 x 值并不相同。

这是我的意思的一个小例子:

Time Value repeat_name
0    5     repeat1
0    5     repeat2
0    5     repeat3
3.1  7     repeat1
3.25 8     repeat2
3    9     repeat3
6.2  5     repeat1
6.5  5     repeat2
6    5     repeat3
9.3  5     repeat1
9.75 5     repeat2
9    5     repeat3

现在我希望有某种方法可以对时间进行分类,然后将所有与分类值匹配的值放入其中

所以我有以下垃圾箱:

Time
0-4 (values (5,5,5,7,8,9))
4-8 (values (5,5,5))
8-12 (values (5,5,5))

然后我可以取这些 bin 的平均值并用 ggplot 绘制直方图。但是,我不确定如何实现我的目标。

我也不确定是否有更好的方法。

提前谢谢你。

【问题讨论】:

  • 时间就是你的x?

标签: r ggplot2 dplyr


【解决方案1】:

只是一些建议。分箱当然是一个挑战。您可以舍入或创建切口。这完全取决于你想展示什么。

我将展示两个选项,一个使用plyr::round_any,另一个使用cut

library(tidyverse)

foo <- read_csv("Time, Value, repeat_name
0,    5,     repeat1
0,    5,     repeat2
0,    5,     repeat3
3.1,  7,     repeat1
3.25, 8,     repeat2
3,    9,     repeat3
6.2,  5,     repeat1
6.5,  5,     repeat2
6,    5,     repeat3
9.3,  5,     repeat1
9.75, 5,     repeat2
9,    5,     repeat3")

foo %>% 
  mutate(time_round = plyr::round_any(Time, 5)) %>% 
  ggplot(aes(time_round, Value)) +
  stat_summary() +
  scale_y_continuous(limits =  c(0, NA))
#> No summary function supplied, defaulting to `mean_se()`


foo %>% 
  mutate(time_cut = cut(Time, c(-Inf,4,8,Inf))) %>% 
  ggplot(aes(time_cut, Value)) +
  stat_summary() +
  scale_y_continuous(limits =  c(0, NA))
#> No summary function supplied, defaulting to `mean_se()`

reprex package (v0.3.0) 于 2020-04-15 创建

【讨论】:

  • 另外值得注意的是,由于 ggplot2 v3.3.0 有分箱比例,即scale_x_binned(breaks = c(2, 4, 8))
  • @teunbrand 感谢您指出这一点。必须将其添加到我的词汇表中:)
【解决方案2】:

如果您想根据另一个变量的分组来绘制一个变量的平均值,那么直方图不是合适的图表,因为直方图反映了 bin 范围内的观察计数。

正如 Tjebo 上面指出的,ggplot 有一些统计函数可以计算数据的汇总统计。

stat_summary_bin() 函数可以计算分箱范围内的汇总统计信息。要从上面计算 Time 的 bin 的平均值,您可以使用以下代码:

ggplot(df, aes(x=Time, y = Value)) +
  stat_summary_bin(geom = "point", 
                   fun.y = mean, 
                   fun.ymin = NULL, 
                   fun.ymax= NULL, 
                   breaks=seq(0, 12,by = 4))

其中mean 是根据数据计算的汇总函数,并且使用seq(0, 12, by = 4) 设置bin 范围以匹配上面的bin 范围。也可以使用 binwidth 参数提供默认 bin 宽度或使用 bins 参数提供 bin 数量。 或者,您可以使用 dplyr::case_when() 语句计算组均值以生成分组变量,按新创建的分组变量对数据框进行分组,最后汇总值。

df %>%
  mutate(
    group_var = case_when(
      Time >=0 & Time < 4 ~ 1,
      Time >= 4 & Time < 8 ~ 2,
      Time >= 8 & Time < 12 ~ 3
    )
  ) %>%
  group_by(group_var) %>% 
  summarize(grouped_mean = mean(Value)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2018-07-05
    • 2020-12-02
    • 1970-01-01
    相关资源
    最近更新 更多