根据值从数据框中删除行,忽略 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))
或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
或使用 subset
和 replace
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, ]
我有一个数据框,我想根据特定列中的值从中删除行。 例如,数据框如下所示:
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))
或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
或使用 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"))
如果您添加 |
所有具有 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, ]