Опускать строки, содержащие определенный столбец NA
Я хочу знать, как опустить значения 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
, где я могу поместить функцию |
?
Ответы
Ответ 1
Вы можете использовать функцию 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
EDIT: Возвращать только строки без NA
s
Если вы хотите удалить все строки с хотя бы одним NA
в любом столбце, просто используйте функцию complete.cases
:
DF[complete.cases(DF), ]
# x y z
# 2 2 10 33
Или если completeFun
уже укоренен в вашем рабочем процессе;)
completeFun(DF, names(DF))
Ответ 2
Используйте 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),]
Ответ 3
Hadley tidyr
просто получил эту удивительную функцию drop_na
library(tidyr)
DF %>% drop_na(y)
x y z
1 1 0 NA
2 2 10 33
Ответ 4
Используйте 'подмножество'
DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
subset(DF, !is.na(y))
Ответ 5
К настоящему времени можно просто использовать:
na.omit(data, cols = c("x", "z"))
Ответ 6
Попробуйте следующее:
cc=is.na(DF$y)
m=which(cc==c("TRUE"))
DF=DF[-m,]
Ответ 7
Пропустите строку, если один из двух определенных столбцов содержит <NA>
.
DF[!is.na(DF$x)&!is.na(DF$z),]
Ответ 8
Просто попробуйте это:
DF %>% t %>% na.omit %>% t