19

我想做这个问题的反面,和这个问题反面,虽然那是关于传说,而不是情节本身。

其他 SO 问题似乎是在询问如何保持未使用的因子水平。我实际上希望我的删除。我有几个名称变量和几个变量属性列(宽格式),用于创建大量条形图。这是一个可重现的示例:

library(ggplot2)
df <- data.frame(name=c("A","B","C"), var1=c(1,NA,2),var2=c(3,4,5))
ggplot(df, aes(x=name,y=var1)) + geom_bar()

我明白了:

在此处输入图像描述

我只想在我的条形图中显示具有相应 var n的名称(例如,B 没有空白区域)。

y=var如果我可以简单地更改输出文件名和位,重用基本绘图代码将非常容易。如果可能的话,我不想仅仅为了在每个图的结果上使用 droplevels 而对我的数据框进行子集化!


根据na.omit()建议更新

考虑一个修改后的数据集:

library(ggplot2)
df <- data.frame(name=c("A","B","C"), var1=c(1,NA,2),var2=c(3,4,5), var3=c(NA,6,7))
ggplot(df, aes(x=name,y=var1)) + geom_bar()

我需要na.omit()用于绘图var1,因为存在 NA。但是由于 na.omit 确保所有列都存在值,因此该图也会删除A,因为它在 NA 中有一个 NA var3。这更类似于我的数据。我总共有 15 条回复,其中充斥着 NA。我只想删除当前绘制的 y 向量没有值的因子水平,而不是在整个数据帧中的任何向量中具有 NA 的因子水平。

4

3 回答 3

20

一个简单的选择是na.omit()在您的数据框上使用df以删除这些行NA

ggplot(na.omit(df), aes(x=name,y=var1)) + geom_bar()

鉴于您的更新,以下

ggplot(df[!is.na(df$var1), ], aes(x=name,y=var1)) + geom_bar()

工作正常,只考虑NAVar1. 鉴于您只绘制nameVar,适用na.omit()于仅包含这些变量的数据框

ggplot(na.omit(df[, c("name", "var1")]), aes(x=name,y=var1)) + geom_bar()
于 2012-07-09T21:07:29.560 回答
6

请注意,在绘图时,您仅使用数据框的两列,这意味着您可以将相关列x[,c("name", "var1")]应用 na.omit 以删除不需要的行(正如 Gavin Simpson 建议的那样) ,而不是传递整个 data.framena.omit(x[,c("name", "var1")])然后绘制这些数据。

我的 R/ggplot 很生锈,我意识到可能有更清洁的方法来实现这一点。

于 2012-07-09T21:30:39.693 回答
1

自从最初提出这个问题以来,已经过去了很多时间。如果我在 2021 年处理这个问题,我会使用类似的东西:

library(ggplot2)
library(tidyr)
df <- data.frame(name=c("A","B","C"), var1=c(1,NA,2),var2=c(3,4,5))

df %>% 
  drop_na(var1) %>% 
  ggplot(aes(name, var1)) +
  geom_col()

reprex 包于 2021-12-03 创建(v2.0.1)

于 2021-12-03T17:54:52.130 回答