【问题标题】:Determine event persistence确定事件持久性
【发布时间】:2021-04-20 01:52:01
【问题描述】:

希望你们一切安好。我有一个 R 问题,我认为这可能是直截了当的,但我无法为它想出一个简洁的代码。 假设我有一个名为“Bloom”的列,当没有检测到绽放时,它的值为 0,然后从 1 开始,直到没有绽放,然后重新开始为 0。我想创建一个新列,告诉我多久绽放持续。 在这里,我创建了一个示例数据框,该示例数据框作为绽放的示例。前 4 天没有开花,然后有一个持续 6 天的开花,所以我想要的新列会产生一个“6”来表示开花持续了 6 天。

bloom<- c(0,0,0,0,1,2,3,4,5,6,0,0,0)
persistence<- c(0,0,0,0,6,6,6,6,6,6,0,0,0)
bloom.df<- data.frame(bloom, persistence)

我在想你会计算值的数量 >0 并用新列填充新列,然后在检测到 0 后重新启动,但不确定这是否是最好的解决方案。 感谢您的帮助和建议!

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    带有rle 的基本 R 选项:

    bloom.df$result <- with(rle(bloom.df$bloom != 0), rep(values * lengths, lengths))
    bloom.df
    
    #   bloom persistence result
    #1      0           0      0
    #2      0           0      0
    #3      0           0      0
    #4      0           0      0
    #5      1           6      6
    #6      2           6      6
    #7      3           6      6
    #8      4           6      6
    #9      5           6      6
    #10     6           6      6
    #11     0           0      0
    #12     0           0      0
    #13     0           0      0
    

    借助data.tables rleid 函数的dplyr 选项:

    library(dplyr)
    
    bloom.df %>% 
      add_count(grp = data.table::rleid(bloom == 0), name = 'result') %>%
      mutate(result = result * as.integer(bloom > 0)) %>%
      select(-grp)
    

    为了比较,我创建了一个名为result 的新列。如果您愿意,显然可以将其替换为 persistence

    【讨论】:

    • 我喜欢 dplyr 选项,非常感谢,工作完美!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多