首页 > 解决方案 > ggplot2 中的 Summarise() 和 group_by() 似乎遗漏了我的数据框中的数据行

问题描述

最近我发布了一个关于如何绘制 y 轴是分类变量的比例的线和点图的问题。我还发布了一些示例数据,并收到了适用于我发布的数据集的回复,代码如下:

library(dplyr)
library(ggplot2)

df %>% 
  group_by(age) %>% 
  summarise(p = mean(result == 'y')) %>% 
  ggplot(aes(x = age, y = p)) +
    geom_point() + 
    geom_line()

它适用于我发布的数据集,起初似乎为更大数据集(读取为 .csv 并分配了名称'df')中相同类型的数据生成图表,如下所示:

result  age
n   37
n   NA
n   40
n   NA
n   NA
n   30
p   23
n   40
n   34
n   28
c   40
n   24
n   NA
p   27
c   40
n   NA
n   28
n   40
n   NA
p   23
n   NA
n   28
p   28
n   NA
n   40
p   NA
n   28
n   NA
n   40
p   20
n   NA
n   NA
n   NA
n   30
n   24
n   NA
c   NA
n   30
n   NA
n   NA
NA  NA
n   NA
n   NA
NA  NA
n   NA
n   30
p   27
n   NA
n   31
n   28
n   NA
n   NA
n   NA
n   28
n   31
n   NA
n   24
c   18
p   30
n   NA
n   NA
n   31
n   30
n   NA
n   31
p   27
n   24
n   28
n   27
n   NA
p   26
n   31
n   24
NA  23
n   NA
n   NA
n   NA
n   NA
n   NA
n   NA
n   NA
n   NA
n   NA
n   NA
n   28
n   26
n   32
n   NA
c   NA
n   31
n   NA
p   32
n   NA
n   NA
p   26
n   NA
n   29
n   NA
n   31
n   29
n   NA
n   NA
n   NA
n   31
p   21
n   33
n   29
n   NA
p   NA
n   29
n   NA
n   NA
p   22
n   28
n   29
n   31
p   27
p   28
n   28
n   27
n   NA

当我运行这段代码

df %>% 
    group_by(age) %>% 
    summarise(prop= mean(result == 'p')) %>% 
    ggplot(aes(x = age, y = prop)) +
    geom_point() + 
    geom_line() +
    scale_x_continuous(breaks = seq(1, 40, 1))

在此数据的数据框中,我得到以下图表:

在此处输入图像描述 但是,我可以在图表中看到我的数据中的行丢失了。图中没有 23 岁的数据,但在我的数据中,这个年龄有一个“p”。此外,如果我在 .csv 中添加新行,其中包含 'result' 中的 p 个条目与 'age' 的 23 个条目在同一行中,然后更新 R 中的数据框并重新绘制图形,没有任何反应。而如果我做同样的事情,输入 'p's 表示 18,图中 18 处的 p 比例确实会增加。

任何人都可以弄清楚发生了什么事吗?提前谢谢了!

标签: rggplot2

解决方案


您尚未处理NA数据中的 s。考虑这个例子 -

mean(c(1, 3, 4))
#[1] 2.666667

mean(c(1, 3, 4, NA))
#[1] NA

mean(c(1, 3, 4, NA), na.rm = TRUE)
#[1] 2.666667

忽略NA带有 的值na.rm = TRUE

library(dplyr)
library(ggplot2)

df %>% 
  group_by(age) %>% 
  summarise(p = mean(result == 'p', na.rm = TRUE)) %>% 
  ggplot(aes(x = age, y = p)) +
  geom_point() + 
  geom_line()

在此处输入图像描述


推荐阅读