我有一个数据框,我想根据特定列中的值从中删除行。 例如,数据框显示如下:
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
参数,但是我不确定在上面的函数中适合它的位置。
干杯, 蚂蚁
答案 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
或将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"))
答案 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, ]