Опустіть рядки, що містять конкретний стовпець NA


129

Я хочу знати, як опускати 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де можна поставити |функцію?

Відповіді:


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

EDIT: Повертайте лише рядки без NAs

Якщо ви хочете усунути всі рядки хоча б одним рядком NAу будь-якому стовпці, просто скористайтеся complete.casesфункцією прямо вгору:

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

Або якщо completeFunце вже закладено у вашому робочому процесі;)

completeFun(DF, names(DF))

Чи можете ви зробити свій підхід жадібним? Візьміть усі стовпці, які взагалі не мають NA.
Лео Леопольд Герц 준영

1
Ви маєте на увазі просто повернути рядки без NAs? Як completeFun(DF, names(DF))?
BenBarnes

Правильно! Будь ласка, подумайте про те, щоб додати його до своєї відповіді, оскільки це загальна потреба тут. - - Я думаю, що відповідь Мнеля не можна розширити як вашу. Ваш функціональний підхід чудовий!
Лео Леопольд Герц 준영

1
Готово! Thx для підказки @ 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. Отже, вихід набору даних є лише другим стовпцем.
Лео Леопольд Герц 준영

2
Використовуйте, na.omitщоб жадібно видалити всі рядки з NA у будь-якому стовпціna.omit(DF)
М. Вікінг

69

Хедлі 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.
М. Вікінг


2

Опустити рядки , якщо будь-який з двох конкретних стовпців містять <NA>.

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

1

Просто спробуйте:

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

Він транспонує кадр даних і опускає нульові рядки, які були "стовпцями" перед транспозицією, а потім ви переміщуєте їх назад.


8
Поясніть, будь ласка, трохи, що відбувається.
vonbrand
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.