首页 > 解决方案 > 在R中一次从数据框中的多个变量中删除Na

问题描述

所以我有一个数据框: df 和我绘制它,但有太多的 Na 并不好。

所以我尝试用1)删除Na:

 df <- na.omit(df)

但是我的数据越来越乱了。2):

 df <- df[!is.na(df$column_name),]

这适用于特定的列名,但在图中我有多个带有 Na 的列名,当我尝试使用相同的命令但对于其他列名时,它会完全更改我的数据。那么任何人都可以帮助我吗?有没有办法!is.na(多个列名)或在 ggplot 中忽略 NA?

我正在使用这个:

df<-Ass1MatrixNoNa %>% gather(test, value, 3:5)
ggplot(df,aes(x=test,fill=value)) +
  geom_bar(position=position_dodge(preserve="single"))

在此处输入图像描述

我得到了一个情节,但有 NA
然后我尝试删除 NA:

Ass1MatrixNoNa <- Ass1Matrix[!is.na(Ass1Matrix$Ass_1_hearingA),]

删除 Ass_1_hearingA Na's 但我也想要hearingB 但忽略第一个,并且仅在第二个中删除 NA:

Ass1MatrixNoNa <- Ass1Matrix[!is.na(Ass1Matrix$Ass_1_hearingB]

标签: rdataframena

解决方案


我不确定这是否是你想要的。但是,如果您尝试warningsgeom_bar有关NAs 的角度进行处理,您可能会从文档 ( help("geom_bar")) 中注意到该函数具有参数na.rm。因此该功能可以为您删除NAs 。尝试

ggplot(df,aes(x=test,fill=value)) +
  geom_bar(position=position_dodge(preserve="single"), na.rm = TRUE)

这样做是你想要的吗?

因此,您可能不一定需要删除df.

编辑:否则,该complete.cases功能可能会帮助您:

df <- data.frame(x = c(1, NA, 3, 4), value = c(1, 2, 3, 4), fill= c(1, 2, NA, 4))
print(df)
#   x value fill
#1  1     1    1
#2 NA     2    2
#3  3     3   NA
#4  4     4    4

ccol <- c("value", "fill") # Cols to keep 'complete'
df_complete <- df[complete.cases(df[, ccol]), ]
print(df_complete)
#   x value fill
#1  1     1    1
#2 NA     2    2
#4  4     4    4

运行complete.cases(x)返回一个逻辑向量,TRUE其中没有NAs 出现在 的行中x

或者,使用tidyverse/ dplyr,类似于以下内容

df_complete2 <- df %>% filter(!is.na(fill) & !is.na(value))

也应该这样做。


推荐阅读