繁体   English   中英

根据值从数据框中删除行,忽略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参数,但是我不确定在上面的函数中适合它的位置。

干杯,蚂蚁

我们需要选择行,其中d是不大于0或出现NAd

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

得到相同的结果。

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

或使用带有replace subset

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

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

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

Wheras,下面将不包括在d列中具有NA且不符合条件!df$d > 0

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM