【问题标题】:How to use group_by and summerise functions together with a condition?如何将 group_by 和 summise 函数与条件一起使用?
【发布时间】:2019-09-03 23:49:03
【问题描述】:

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

 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 和 summarise 函数,但无法合并条件并且不知道如何去做。因此,如果有人可以帮助我,我将不胜感激。

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'}

【问题讨论】:

    标签: r


    【解决方案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
    

    如果有几个月只有一个 stutus 在过滤器中包含这个词 &amp; length(unique(status)) == 2

    【讨论】:

      【解决方案2】:

      这是另一种选择,使用与您最初尝试类似的方法,但使用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。

      【讨论】:

        猜你喜欢
        • 2021-07-20
        • 2016-10-17
        • 2019-11-03
        • 2018-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-14
        • 1970-01-01
        相关资源
        最近更新 更多