[英]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或出现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))
得到相同的结果。
我们可以用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.