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

时间:2019-01-17 14:33:02

标签: r dataframe na

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

    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参数,但是我不确定在上面的函数中适合它的位置。

干杯, 蚂蚁

3 个答案:

答案 0 :(得分:2)

我们需要选择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))

获得相同的结果。

答案 1 :(得分:1)

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

与上述herehere的方法稍有不同

数据

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

答案 2 :(得分:0)

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

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

但是,下面的行将不包括在列NA中具有d且与条件!df$d > 0不匹配的行

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