【问题标题】:dplyr filter by multiple conditions including datedplyr 按多个条件过滤,包括日期
【发布时间】:2021-01-06 12:57:42
【问题描述】:

我的数据集:

> as_tibble(wq4)
# A tibble: 58,538 x 4
   Date       Site  Analyte                    Value2
   <date>     <fct> <fct>                       <dbl>
 1 2014-01-10  N2   Ammonia NH3-N               0.01 
 2 2014-01-10  N2   Chlorophyll - a             1.5  
 3 2014-01-10  N2   Filtered Total Phosphorus   0.005
 4 2014-01-10  N2   Oxidised Nitrogen           0.1  
 5 2014-01-10  N2   Total Nitrogen              0.3  
 6 2014-01-10  N2   Total Phosphorus            0.008
 7 2014-01-10  N2   Ammonia NH3-N               0.02 
 8 2014-01-10  N2   Chlorophyll - a             1.4  
 9 2014-01-10  N2   Conductivity                191    
10 2014-01-10  N2   Enterococci                 19    
# … with 58,528 more rows

我想使用 dplyr 根据多个条件过滤掉一组特定的值。到目前为止我得到的是:

filter(wq4, Site != "N1" & !Date %in% c("2019-04-17", "2019-04-18", "2019-04-19"))

我基本上想删除 2019 年 4 月 17 日至 19 日期间的所有数据,仅在站点 N1(不是我的任何其他站点)。

我认为这行代码不适合我。要么是“&”,要么是 dplyr 正在为日期格式而苦苦挣扎?

有什么建议吗? 谢谢。

【问题讨论】:

  • 尝试用括号括起您的各个布尔语句。

标签: r filter dplyr tidyverse


【解决方案1】:

您的示例数据不包括"N1",但这里有一个猜测:

filter(wq4, Site != "N1" | !between(Date, as.Date("2019-04-17"), as.Date("2019-04-19")))

将返回不是"N1"(任何日期)的站点,以及不在这两个日期之间的站点"N1" 的数据。

如果您愿意,您仍然可以使用%in% 逻辑,我提供!between 作为替代方案有两个原因:

  1. Date对象不一定是整数,diff(c(Sys.Date(), Sys.Date() + 0.1))返回0.1 days,说明是浮点数。如果您的日期显然都是完整的,并且没有任何事情可能使它们偏离完美的一天,那么您的 %in% 应该可以正常工作,但按照 Why are these numbers not equal? 的思路,浮点相等性是不确定的。

    举个例子:

    Sys.Date()
    # [1] "2020-09-19"
    Sys.Date() %in% as.Date("2020-09-19")
    # [1] TRUE
    (Sys.Date() + 0.1)
    # [1] "2020-09-19"                             # still looks integral
    (Sys.Date() + 0.1) %in% as.Date("2020-09-19")
    # [1] FALSE
    
  2. 如果您想跨越几天以上,处理开始/结束日期而不是每个...可能的...日期会更有效。

【讨论】:

    【解决方案2】:

    尝试:

    library(dplyr)
    wq4 %>%
       filter(!(Site == "N1" & 
                Date %in% as.Date(c("2019-04-17", "2019-04-18", "2019-04-19"))))
    

    subset中的相同表达式:

    subset(wq4, !(Site == "N1" & 
                  Date %in% as.Date(c("2019-04-17", "2019-04-18", "2019-04-19"))))
    

    Site == "N1" &amp; Date %in% as.Date(c("2019-04-17", "2019-04-18", "2019-04-19") 是您要删除的行。所以我们在它前面加上! 符号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 2018-04-13
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      相关资源
      最近更新 更多