省略包含NA的特定列的行

时间:2012-06-29 00:02:02

标签: r dataframe 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,我可以在哪里放置|功能?

8 个答案:

答案 0 :(得分:162)

使用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),]

答案 1 :(得分:63)

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

编辑: 仅返回没有NA的行

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

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

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

completeFun(DF, names(DF))

答案 2 :(得分:46)

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

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

答案 3 :(得分:27)

使用'subset'

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

答案 4 :(得分:3)

试试这个:

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

答案 5 :(得分:3)

现在,可以只使用:

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

只需尝试一下:

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