根据值从数据框中删除行,忽略 NA

remove rows from dataframe based on value, ignoring NAs

我有一个数据框,我想根据特定列中的值从中删除行。 例如,数据框如下所示:

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

我想删除 d 列中所有值大于 0 的行。我一直在尝试使用以下代码来执行此操作:

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

但这似乎具有删除 d 列中具有 NA 值的所有值行的效果。我假设需要一个 na.rm = TRUE 参数,但我不确定将它放在上面的函数中的什么位置。

干杯, 蚂蚁

我们需要 select d 不大于 0 的行或者 d

中有 NA
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))

dplyrfilter

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

!d > 0部分也可以反转为

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

得到相同的结果。

我们可以用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

或使用 subsetreplace

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

tidyverse

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

与提到的方法略有不同 or

数据

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"))

如果您添加 | 所有具有 NA 的行都将匹配。对于 d 中不是 NA 的那些,条件 !df$d > 0 将被执行。所以我认为您正在寻找:

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

然而,下面不会包含在列 d 中具有 NA 且不符合条件 !df$d > 0

的行
df[!is.na(df$d) & !df$d > 0,  ]