удалить строки из кадра данных на основе значения, игнорируя NA - PullRequest
0 голосов
/ 17 января 2019

У меня есть фрейм данных, из которого я хотел бы удалить строки на основе значения в определенном столбце. Например, датафрейм выглядит примерно так:

    a  b  c  d 
1   1  2  3  0
2   4 NA  1 NA
3   6  4  0  1
4  NA  5  0  0

Я хотел бы удалить все строки со значением больше 0 в столбце d. Я пытался использовать следующий код для этого:

df <- df[!df$d > 0, ]

но похоже, что это приводит к удалению всех значений - строк со значением NA в столбце d. Я предполагал, что необходим аргумент na.rm = TRUE, но я не был уверен, где его разместить в приведенной выше функции.

Ура, Ant

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Мы можем построить логический вектор с complete.cases

subset(df, !d > 0 | complete.cases(d))
#   a b c d
#1  1 2 3 0
#3  6 4 0 1
#4 NA 5 0 0

Или используйте subset с replace

subset(df,  !replace(d, is.na(d), 0) > 0)

Или с tidyverse

library(tidyverse)
df %>%
   filter(!replace_na(d, 0) >0)

, что немного отличается от упомянутого метода здесь или здесь

Данные

df <- structure(list(a = c(1L, 4L, 6L, NA), b = c(2L, NA, 4L, 5L), 
c = c(3L, 1L, 0L, 0L), d = c(0L, NA, 1L, 0L)), class = "data.frame",
 row.names = c("1", "2", "3", "4"))
0 голосов
/ 17 января 2019

Если вы добавите |, все строки с NA будут совпадать. Условие !df$d > 0 будет выполнено для тех в d, которые не являются NA. Поэтому я думаю, что вы искали:

df[is.na(df$d) | !df$d > 0,  ]

Wheras, ниже не будет строк, имеющих NA в столбце d и не соответствующих условию !df$d > 0

df[!is.na(df$d) & !df$d > 0,  ]
0 голосов
/ 17 января 2019

Нам нужно выбрать строки, где d не больше 0 ИЛИ NA в d

df[with(df, !d > 0 | is.na(d)), ]

#   a  b c  d
#1  1  2 3  0
#2  4 NA 1 NA
#4 NA  5 0  0

Или мы также можем использовать subset

subset(df, !d > 0 | is.na(d))

или dplyr filter

library(dplyr)
df %>% filter(!d > 0 | is.na(d))

Партия !d > 0 также может быть обращена к

subset(df, d < 1 | is.na(d))

чтобы получить тот же результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...