如何与条件一起使用group_by和summerise函数?

时间:2019-09-03 13:47:03

标签: r

我有一个数据集,其中包含三列“时间”,“状态”和“水位”。时间变量的格式类似于“ 2007-03-22 06:45:00”,跨度多年。 status是一个只有两个值“ High”或“ Low”的二进制变量(您可以想到一个传感器,它已经日复一日,分分钟地测量了很多年,并确定测量结果是“低”还是“高”)。 / p>

 time   status   water_level 
2007-03-21 06:20:00 Low  2.4 
2007-03-21 19:55:00 Low  2.3 
2007-03-21 23:50:00 High 2.1 
2016-04-10 19:55:00 Low  3.5 
2016-04-11 23:50:00 High 3.6

我的目标是仅当该月的“高”和“低”的数目相等时,才计算每个月内的平均水位,否则我希望该月被完全去除。

我一起尝试了group_by和summerise函数,但是无法合并条件,也不知道如何执行。因此,如果有人可以帮助我,我将不胜感激。

mydata <- mydata %>% 
          group_by(time = floor_date(time, "month")) %>%
                 if(length(status == 'High') == length(status == 'Low')
                 {summarize(water_level = mean(water_level)}
                   else {summarize(water_level = 'NA'}

2 个答案:

答案 0 :(得分:1)

也许是这样吗?

df %>% 
  mutate(month= months(time)) %>% 
  add_count(month, status) %>% 
  group_by(month) %>% 
   filter(length(unique(n)) == 1) %>% 
   summarise(mean_water_level = mean(water_level, na.rm=T))
# A tibble: 1 x 2
  month mean_water_level
  <chr>            <dbl>
1 April             3.55

如果只有一个针孔的月份在过滤器中包含该术语 & length(unique(status)) == 2

答案 1 :(得分:0)

这是另一个使用与原始尝试类似的方法的选项,但是使用filter函数而不是if语句。

library(dplyr)
library(lubridate)

mydata %>% 
    group_by(time = format(time, "%Y-%m")) %>% 
      filter(sum(status == 'High') == sum(status == 'Low')) %>%
         summarize(water_level = mean(water_level)) 

还要注意使用sum而不是lengthlength(status == 'High')将返回状态的长度,因为它将计算所有TRUE和FALSE。 sum仅会计算TRUE。