【问题标题】:identify first row in a sequence change in order to find the lag value in another variable in r识别序列变化中的第一行,以便在 r 中的另一个变量中找到滞后值
【发布时间】:2020-07-23 22:58:35
【问题描述】:

我有一个带有 id、类别和值的数据框。该类别具有“开”或“关”的序列运行。我想确定每次发生这种情况时序列更改为“on”的第一行。由此我想确定滞后中的“价值”并将行引向这一点。这需要按组 (id) 完成

我可以通过过滤到类别更改的时间来找到序列更改的开始,但希望保持数据框完整,以便在 value 变量中找到滞后值和超前值。

这是一个示例数据框。 因此,例如在 id "b" 中,我需要识别值 54 和 90 感谢任何帮助。

id <- c("a", "a", "a", "a", "a", "b", "b", "b", "b", "b","c", "c","c","c","c","c","c","c" )
category <- c("OFF", "OFF", "ON", "ON", "ON", "OFF", "OFF", "OFF", "ON", "ON", "OFF", "OFF","OFF","OFF","OFF", "ON", "ON","ON")
value<- c(100,90,65,55,32,23,45,54,27,90,100,100,100,30,30,25, 45, 67)
dat<-data.frame(id, category, value)
dat


【问题讨论】:

    标签: r sequence lag


    【解决方案1】:

    这可能有帮助

    library(dplyr)
    library(data.table)
    dat %>%
       group_by(id, grp = rleid(category)) %>%
       slice(n())
    

    【讨论】:

      【解决方案2】:

      您可以使用来自dplyr 库的laglead

      library(dplyr)
      
      dat %>%
        group_by(id) %>%
        mutate(change = category == 'OFF' & lead(category) == 'ON' | 
                        lag(category, default = first(category)) == 'ON' & 
                        lag(category, 2) == 'OFF')
      
      
      #   id    category value change
      #   <chr> <chr>    <dbl> <lgl> 
      # 1 a     OFF        100 FALSE 
      # 2 a     OFF         90 TRUE  
      # 3 a     ON          65 FALSE 
      # 4 a     ON          55 TRUE  
      # 5 a     ON          32 FALSE 
      # 6 b     OFF         23 FALSE 
      # 7 b     OFF         45 FALSE 
      # 8 b     OFF         54 TRUE  
      # 9 b     ON          27 FALSE 
      #10 b     ON          90 TRUE  
      #11 c     OFF        100 FALSE 
      #12 c     OFF        100 FALSE 
      #13 c     OFF        100 FALSE 
      #14 c     OFF         30 FALSE 
      #15 c     OFF         30 TRUE  
      #16 c     ON          25 FALSE 
      #17 c     ON          45 TRUE  
      #18 c     ON          67 FALSE 
      

      我将数据框保持原样,以便于验证结果。如果您只对TRUE 行感兴趣,您可以使用filter(change) 来获取这些行。

      【讨论】:

        猜你喜欢
        • 2021-02-13
        • 2023-01-09
        • 2023-03-14
        • 1970-01-01
        • 2010-11-21
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 2021-02-13
        相关资源
        最近更新 更多