我想知道如何省略数据框中的NA
值,但仅限于我感兴趣的某些列。
例如,
DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
但我只想省略y
为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=na
或z=na
,我可以在哪里放置|
功能?
答案 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