缺失值正在在ggplot2的箱线图中进行绘制。

20

我正在尝试使用ggplot2绘制一个非常简单的箱线图。我的数据是物种丰富度与土地利用类型之间的关系。但是,我的数据中有两个NA值。出于某种奇怪的原因,它们被绘制出来了,即使它们被R理解为NA值。有什么建议可以将它们删除吗?

我正在使用的代码是:

ggplot(data, aes(x=luse, y=rich))+
  geom_boxplot(mapping = NULL, data = NULL, stat = "boxplot", position = "dodge", outlier.colour = "red", outlier.shape = 16, outlier.size = 2, notch = F, notchwidth = 0.5)+
  scale_x_discrete("luse", drop=T)+
  geom_smooth(method="loess",aes(group=1))

然而,该图表中luse列包含2个NA值。不幸的是,我无法发布图片,但请想象我的图表中添加了一个NA条形图。

19
ggplot(na.omit(data), aes(x=luse, y=rich)) + ... - Roland
24
针对更一般的情况:如果数据包含除正在绘制的两个变量之外的其他变量,na.omit(data)会删除任何变量上有缺失值的观测值。这可能会对您的图表和/或分析产生意想不到的后果。您可以使用 data=na.omit(data[,c("var1","var2",...)]),其中var1、var2等是您需要用于图表的变量。 - Maxim.K
4
对@Maxim.K点赞。我遇到了一个类似的问题,处理一个大数据框时,其中一个变量有极高比例的NA值。我无法完全解决语法问题,只是想在我感兴趣的变量中摆脱NA。但请注意,如果你只对一个变量感兴趣,就像我一样,上面的代码返回一个向量,你必须选择至少两列数据框才能使其按原来的方式工作。 - svannoy
3个回答

10
您可以尝试在代码的第一行使用 subset() 函数。
ggplot(data=subset(data, !is.na(luse)), aes(x=luse, y=rich))+

参考自:Eliminating NAs from a ggplot


3
这是一个正式的回答,使用上面的评论来将tidyverse/dplyr中的!is.na()filter()结合起来。如果您有一个基本的tidyverse操作,比如过滤NAs,可以在ggplot调用中直接完成,以避免创建新的数据框架: ggplot(data %>% filter(!is.na(luse)), aes(x = luse, y = rich)) + geom_boxplot()

这与之前的答案有何不同? - pogibas
它不使用 is.na() == FALSE 或子集操作,这些方法不够直接。 - user29609
“subset” 为什么不够直接?另外,你使用的管道符与这个问题无关。 - pogibas

0

你也可以在dplyr/tidyverse中使用filter()函数:

data %>% filter(is.na(luse) == FALSE) %>% 
   ggplot(aes(x=luse, y=rich)) +
   geom_boxplot()

这样你就不必创建一个新对象了。


你是不是想说 !is.na()?或者你需要所有的NA值? ;) 另外,你不一定需要指定 is.na(x) == TRUE,因为它会自动转换成逻辑向量,然后被 filter() 使用... P.S. 欢迎来到SOF。 - tjebo
哦,是的。打错字了,抱歉。谢谢你指出来。另外,太棒了。我不知道你可以直接转换 is.na() - Luke McDonald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接