r-dplyr通过包括日期在内的多个条件进行过滤



我的数据集:

> 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站点(而不是我的任何其他站点(。

我认为这行代码不适合我&quot;也许dplyr在日期格式上遇到了麻烦?

有什么建议吗?谢谢

尝试使用:

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" & Date %in% as.Date(c("2019-04-17", "2019-04-18", "2019-04-19")是要删除的行。所以我们在它前面加上!符号。

您的样本数据不包括"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%应该很好,但大致如下:为什么这些数字不相等?,浮点相等性不能得到保证。

    例如:

    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. 如果你想跨越几天以上,处理开始/结束日期比处理每个。。。可能的日期

最新更新