首页 > 解决方案 > 使用多个变量过滤两次并计算行数

问题描述

我有这个按 id_station、id_parameter、“zona”及其日期分组的数据框。

id_station id_parameter   zona    year   month  day  mediaDiaria sdDiaria Count
      
 1 AJM        CO           SO     2019     1     1       0.281   0.181     21
 2 AJM        CO           SO     2019     1     2       0.367   0.230     24
 3 AJM        CO           SO     2019     1     3       0.371   0.160     24
 4 AJM        CO           SO     2019     1     4       0.312   0.185     24
 5 AJM        CO           SO     2019     1     5       0.296   0.168     24
 6 AJM        CO           SO     2019     1     6       0.225   0.142     24
 7 AJM        CO           SO     2019     1     7       0.281   0.0873    21
 8 AJM        CO           SO     2019     1     8       0.388   0.236     24
 9 AJM        CO           SO     2019     1     9       0.421   0.265     24
10 AJM        CO           SO     2019     1    10       0.225   0.103     24

我想做的是过滤 2019 年 3 月 1 日至 2020 年 2 月 29 日。我会将其视为“第 1 年”。之后,我想计算第 1 年和每个 id_station 中的 Count 行数,以消除 Count > 18 的行数少于 275 行(天)的站中的所有行。

我用过滤器尝试了以下操作:

Year1in2019CO <- datosCO %>%
                 filter(year == 2019, month %in% c(3:12)) %>%
                 group_by(id_station, id_parameter, zona, year, month, day) %>%
                 summarise(mediaDiaria = mean(valor, na.rm = TRUE), sdDiaria = sd(valor, na.rm = TRUE), 
                 Count = sum(!is.na(valor)))
Year1in2020CO <- datosCO %>%
                 filter(year == 2020, month %in% c(1:2)) %>%
                 group_by(id_station, id_parameter, zona, year, month, day) %>%
                 summarise(mediaDiaria = mean(valor, na.rm = TRUE), sdDiaria = sd(valor, na.rm = TRUE),
                 Count = sum(!is.na(valor)))

Year1CO <- bind_rows(Year1in2019CO, Year1in2020CO)

它完成了这项工作。但是有没有办法在只创建一个数据框而不是 3 个的同时做到这一点?

我已经尝试了以下计数行部分:

YEAR1dfCO_2 <- Year1CO %>% 
           group_by(id_station) %>%
           summarise(dws = sum(Count > 18))

虽然它确实为我提供了我需要的东西,但我不知道如何从原始数据集 (Year1CO) 中删除第 1 年计数中少于 275 行(> 18)的站的所有数据。

你能帮我么?

标签: rdataframefiltercount

解决方案


这可能会奏效。首先,使用构造日期过滤第 1 年的行,然后根据您描述的条件删除站点。

library(tidyverse)
yr1 <- datosCO %>%
  mutate(d = as.Date(paste(year, month, day, sep = "-"))) %>%
  filter(between(d, as.Date("2019-03-01"), as.Date("2020-02-29"))) %>%
  group_by(id_station, id_parameter, zona, d) %>%
  summarise(mediaDiaria = mean(valor, na.rm = TRUE),
            sdDiaria = sd(valor, na.rm = TRUE), 
            Count = sum(!is.na(valor)))

yr1 %>%
  group_by(id_station) %>%
  filter(sum(Count > 18) < 275) %>%
  ungroup()

推荐阅读