【问题标题】:R: Grouping descrete time series by years [duplicate]R:按年对离散时间序列进行分组[重复]
【发布时间】:2020-08-04 07:59:11
【问题描述】:

我正在研究干旱期数据的夏季时间序列,并试图确定各个时期。我的问题是我当前使用的代码无法识别一年何时发生变化,因此它为夏末和明年夏初分配了相同的 id。

这是我拥有的数据的简化版本。

myData <- tibble(series = rep("FS",21),
                 date = c("2016-10-26","2016-10-27","2016-10-28","2016-10-29","2016-10-30","2016-10-31","2017-05-01","2017-05-02","2017-05-03","2017-05-04","2017-05-05","2017-05-06","2017-05-07","2017-05-08","2017-05-09","2017-05-10","2017-05-11","2017-05-12","2017-05-13","2017-05-14","2017-05-15"),
                 year = c(rep(2016,6),rep(2017,15)),
                 day_status = c(rep("normal",3),rep("drought",16),rep("normal",2)))

> myData
# A tibble: 21 x 4
   series date        year day_status
   <chr>  <chr>      <dbl> <chr>     
 1 FS     2016-10-26  2016 normal    
 2 FS     2016-10-27  2016 normal    
 3 FS     2016-10-28  2016 normal    
 4 FS     2016-10-29  2016 drought   
 5 FS     2016-10-30  2016 drought   
 6 FS     2016-10-31  2016 drought   
 7 FS     2017-05-01  2017 drought   
 8 FS     2017-05-02  2017 drought   
 9 FS     2017-05-03  2017 drought   
10 FS     2017-05-04  2017 drought   
# ... with 11 more rows

我正在寻找的结果是这样的

> myData2
# A tibble: 21 x 5
   series date        year day_status group
   <chr>  <chr>      <dbl> <chr>      <dbl>
 1 FS     2016-10-26  2016 normal         1
 2 FS     2016-10-27  2016 normal         1
 3 FS     2016-10-28  2016 normal         1
 4 FS     2016-10-29  2016 drought        2
 5 FS     2016-10-30  2016 drought        2
 6 FS     2016-10-31  2016 drought        2
 7 FS     2017-05-01  2017 drought        3
 8 FS     2017-05-02  2017 drought        3
 9 FS     2017-05-03  2017 drought        3
10 FS     2017-05-04  2017 drought        3
# ... with 11 more rows

我一直在使用的代码是 myData$group &lt;- with(myData, rep(seq_along(z&lt;-rle(myData$day_status)$lengths),z)),但它将 10 月和 5 月的干旱指定为相同的干旱,但事实并非如此。

我尝试然后使用 dplyr 和 group_by 使该功能当时运行一年

  group_by(year) %>%
  mutate(group = rep(seq_along(z<-rle(myData$day_status)$lengths),z)) %>%
  ungroup() %>%
  {. ->> myData}

但这会产生错误错误:列 group 的长度必须为 6(组大小)或 1,而不是 21。我收集到这与group_by 的工作方式有关,但我不完全理解问题所在。 非常感谢任何帮助!

【问题讨论】:

    标签: r dplyr grouping


    【解决方案1】:

    对于这种情况,我使用rle

    rleLengths <- rle(paste0(myData$year, myData$day_status))$lengths
    
    
    myData <- myData %>%
      mutate(group = rep(1:length(rleLengths), rleLengths)
    
    myData$group
    
    [1] 1 1 1 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4
    

    【讨论】:

    • 谢谢!这非常有效。只是一个问题,为什么需要单独定义rleLengths?
    • 不必单独定义。您可以在突变中一次又一次地调用它,但这将是多余的。
    【解决方案2】:

    您可以在dplyr 1.0.0 中使用cur_group_id

    library(dplyr)
    myData %>% group_by(year, day_status) %>% mutate(group = cur_group_id()) 
    

    如果您希望在组出现时创建它们,则基本 R 选项是:

    myData <- transform(myData, group = paste0(year, day_status))
    transform(myData, group = match(group, unique(group)))
    
    
    #   series       date year day_status group
    #1      FS 2016-10-26 2016     normal     1
    #2      FS 2016-10-27 2016     normal     1
    #3      FS 2016-10-28 2016     normal     1
    #4      FS 2016-10-29 2016    drought     2
    #5      FS 2016-10-30 2016    drought     2
    #6      FS 2016-10-31 2016    drought     2
    #7      FS 2017-05-01 2017    drought     3
    #8      FS 2017-05-02 2017    drought     3
    #9      FS 2017-05-03 2017    drought     3
    #10     FS 2017-05-04 2017    drought     3
    #11     FS 2017-05-05 2017    drought     3
    #12     FS 2017-05-06 2017    drought     3
    #13     FS 2017-05-07 2017    drought     3
    #14     FS 2017-05-08 2017    drought     3
    #15     FS 2017-05-09 2017    drought     3
    #16     FS 2017-05-10 2017    drought     3
    #17     FS 2017-05-11 2017    drought     3
    #18     FS 2017-05-12 2017    drought     3
    #19     FS 2017-05-13 2017    drought     3
    #20     FS 2017-05-14 2017     normal     4
    #21     FS 2017-05-15 2017     normal     4
    

    【讨论】:

    • 嗯,我尝试使用 cur_group_id() 但我认为我没有正确使用它。对于同一年的所有正常时期和干旱时期,它总是给出相同的数字。
    • 这很奇怪。它为您的数据提供了 4 个组。你先做group_by了吗?基本 R 选项有效吗?
    • 我尝试将它与我的整个数据一起使用,所以这可能是导致问题的原因。因为我有几个系列,所以我使用了 group_by(series, year, day_status)。但即使使用简化的数据,组顺序对我来说也有点有趣:它是 2、2、2、1、1、1、3、3、3。基础 R 选项完美运行!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多