155

我想知道如何省略NA数据框中的值,但仅限于我感兴趣的某些列。

例如,

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

但我只想省略数据 where yis NA,因此结果应该是

  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=naor z=na,我可以把|in 函数放在哪里?

4

9 回答 9

229

利用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),]
于 2012-06-29T00:06:10.070 回答
96

哈德利tidyr刚刚得到了这个惊人的功能drop_na

library(tidyr)
DF %>% drop_na(y)
  x  y  z
1 1  0 NA
2 2 10 33
于 2016-08-16T18:37:12.930 回答
93

您可以使用该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

编辑: 只返回没有NAs 的行

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

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

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

completeFun(DF, names(DF))
于 2012-06-29T08:08:52.327 回答
36

使用“子集”

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
subset(DF, !is.na(y))
于 2013-06-12T19:00:24.693 回答
16

可以na.omit用于data.table

na.omit(data, cols = c("x", "z"))
于 2019-02-28T11:48:15.117 回答
6

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

DF[!is.na(DF$x)&!is.na(DF$z),]
于 2019-08-21T18:44:58.613 回答
3

尝试这个:

cc=is.na(DF$y)
m=which(cc==c("TRUE"))
DF=DF[-m,]
于 2012-06-29T01:33:56.987 回答
1

试试这个:

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

它转置数据帧并省略转置之前为“列”的空行,然后将其转回。

于 2019-08-22T19:59:40.077 回答
1

要更新,一种tidyverse方法dplyr

library(dplyr)

your_data_frame %>% 
  filter(!is.na(region_column))
于 2021-09-20T02:56:21.623 回答