省略包含特定NA列的行


129

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

例如,

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

但是我只想省略数据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=naz=na,我可以|在哪里放置in函数?

Answers:


79

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

你能使自己的方法贪婪吗?取所有根本没有NA的列。
莱奥波德·赫兹(LéoLéopoldHertz)2017年

1
您的意思是只返回没有s的NA?喜欢completeFun(DF, names(DF))吗?
BenBarnes

正确!请考虑将其添加到您的答案中,因为这是此处的常见需求。--我认为mnel的答案无法像您一样扩展。您的函数方法很棒!
莱奥波德·赫兹(LéoLéopoldHertz)2017年

1
做完了!提示小费@LéoLéopoldHertz준영
BenBarnes

192

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
如何将这种方法贪婪地应用于数据集中的所有列?如果任何列值为NA,则跳过。因此,数据集输出仅是第二列。
莱奥波德·赫兹(LéoLéopoldHertz)2015年

2
使用na.omit贪婪地删除所有行与NA任何列na.omit(DF)
M.维京

68

哈德利才有tidyr了这个惊人的功能drop_na

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

30

使用“子集”

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

9

可以na.omit用于data.table

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

3
cols=参数在data.table::na.omit库中可用。不是基地stats::na.omit
M. Viking

3

试试这个:

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

2

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

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

1

尝试一下:

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

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


8
请解释一下发生了什么。
vonbrand,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.