我想做this question的反面,与this question相反,虽然那是关于传说,而不是情节本身。
其他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
,因为它在var3
中具有NA。这更类似于我的数据。我总共响应了15个NAs。我只想删除没有当前绘制的y向量值的因子级别,而不是整个数据帧中任何向量中的NAs。
答案 0 :(得分: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()
工作正常,只考虑NA
中的Var1
。鉴于您只绘制name
和Var
,请将na.omit()
应用于仅包含这些变量的数据框
ggplot(na.omit(df[, c("name", "var1")]), aes(x=name,y=var1)) + geom_bar()
答案 1 :(得分:5)
请注意,在绘图时,您只使用数据框的两列,这意味着您可以使用相关列x[,c("name", "var1")]
取na.omit来移除整个data.frame而不是传递整个data.frame不需要的行(如Gavin Simpson建议的那样)na.omit(x[,c("name", "var1")])
然后绘制这些数据。
我的R / ggplot非常生疏,我意识到可能有更简洁的方法来实现这一目标。