省略包含 NA 特定列的行

我想知道如何在数据框架中省略 NA值,但只在我感兴趣的一些列中省略。

比如说,

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))

但是我只想省略 yNA的数据,因此结果应该是

  x  y  z
1 1  0 NA
2 2 10 33

na.omit似乎删除所有包含任何 NA的行。

有人能帮我解决这个简单的问题吗?

但如果我现在改变这个问题:

DF <- data.frame(x = c(1, 2, 3,NA), y = c(1,0, 10, NA), z=c(43,NA, 33, NA))

如果我只想省略 x=naz=na,我可以在哪里把 |的功能?

296977 次浏览

使用 is.na

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
DF[!is.na(DF$y),]

试试这个:

cc=is.na(DF$y)
m=which(cc==c("TRUE"))
DF=DF[-m,]

您可以使用 complete.cases函数并将其放入一个函数中,如下所示:

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))


completeFun <- function(data, desiredCols) {
completeVec <- complete.cases(data[, desiredCols])
return(data[completeVec, ])
}


completeFun(DF, "y")
#   x  y  z
# 1 1  0 NA
# 2 2 10 33


completeFun(DF, c("y", "z"))
#   x  y  z
# 2 2 10 33

编辑: < em > 只返回没有 NA的行

如果您想消除任何列中至少有一个 NA的所有行,只需直接使用 complete.cases函数:

DF[complete.cases(DF), ]
#   x  y  z
# 2 2 10 33

或者如果 completeFun已经在您的工作流程中根深蒂固;)

completeFun(DF, names(DF))

使用“子集”

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
subset(DF, !is.na(y))

Hadley 的 tidyr刚刚得到了这个神奇的函数 drop_na

library(tidyr)
DF %>% drop_na(y)
x  y  z
1 1  0 NA
2 2 10 33

对于 data.table,可以使用 na.omit:

na.omit(data, cols = c("x", "z"))

如果两个特定列中的任何一个包含 <NA>,则忽略行。

DF[!is.na(DF$x)&!is.na(DF$z),]

试试这个:

DF %>% t %>% na.omit %>% t

它转换数据帧,省略转换前为“列”的空行,然后再转换回来。

更新,tidyverse方法与 dplyr:

library(dplyr)


your_data_frame %>%
filter(!is.na(region_column))

您不需要使用 complete.cases创建一个自定义函数来删除特定列中包含 NA 的行。下面是一个可重复的例子:

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
DF
#>   x  y  z
#> 1 1  0 NA
#> 2 2 10 33
#> 3 3 NA 22
DF[complete.cases(DF$y),]
#>   x  y  z
#> 1 1  0 NA
#> 2 2 10 33

创建于2022-08-27与 Reprex v2.0.2

正如你所看到的,它删除了在特定列中带有 NA 的行。