【问题标题】:remove rows from dataframe based on value, ignoring NAs根据值从数据框中删除行,忽略 NA
【发布时间】:2019-06-11 18:48:52
【问题描述】:

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

    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 = TRUEargument,但我不确定在上面的函数中放置它的位置。

干杯, 蚂蚁

【问题讨论】:

  • 尝试使用df[!(df$d &gt; 0 &amp; !is.na(df$d)), ] 或使用filter from dplyr 即df %&gt;% filter(!d &gt; 0)
  • @akrun 这两种方法我都试过了。在每一个中,代码似乎都删除了 d 列中值 >0 的所有行和 d 列中所有具有 NA 的行。有一种方法可以保留 col d = NA 的值(上例中的第 1,2 和 4 行)。
  • 好吧,我想我认为你的情况不同。你需要is.na中的相反条件@
  • @RonakShah 代码看起来已成功删除所有“>0”行,但似乎已将数据框中 d = NA 到 NA 的所有其他值转换为 NA
  • @Ant 似乎可以在未更改任何信息的情况下共享示例数据。您可以在下面查看我的答案。

标签: r dataframe na


【解决方案1】:

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

或dplyrfilter

library(dplyr)
df %>% filter(!d > 0 | is.na(d))

!d &gt; 0 部分也可以反转为

subset(df, d < 1 | is.na(d))

得到相同的结果。

【讨论】:

    【解决方案2】:

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

    这与here或here提到的方法略有不同

    数据

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

    【讨论】:

      【解决方案3】:

      如果您添加 |所有具有 NA 的行将匹配。条件!df$d &gt; 0 将为d 中不是NA 的那些人执行。所以我认为您正在寻找:

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

      Wheras,以下内容不会包括在 d 列中具有 NA 且不符合条件 !df$d &gt; 0 的行

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

      【讨论】:

        猜你喜欢
        • 2013-03-26
        • 2016-07-07
        • 1970-01-01
        • 1970-01-01
        • 2021-06-23
        • 2019-07-27
        • 1970-01-01
        • 2022-09-22
        • 1970-01-01
        相关资源
        最近更新 更多