【问题标题】:Removing rows in a data frame following a logical sequence按照逻辑顺序删除数据框中的行
【发布时间】:2020-10-21 07:24:53
【问题描述】:

我希望有一个“扩张”后跟“收缩”的逻辑顺序,而不是紧密重复。

考虑这个数据框:

df <- structure(list(Date = structure(c(2922, 3652, 4018, 17897, 7305, 
8766, 13514, 14610, 14975), class = "Date"), LC = c(2148.55025151515, 
997.863792207792, 1027.36556255411, 5931.96483571429, -5317.829504329, 
-1293.82342294372, -1733.40640844156, -1558.7330974026, -2262.76932705628
), State = c("Expansion", "Contraction", "Expansion", "Expansion", 
"Contraction", "Contraction", "Contraction", "Expansion", "Contraction"
)), row.names = c(NA, -9L), class = "data.frame")

想要的输出是:

newdf <- structure(list(Date = structure(c(2922, 3652, 4018, 7305, 14610
), class = "Date"), LC = c(2148.55025151515, 997.863792207792, 
1027.36556255411, -5317.829504329, -1558.7330974026), State = c("Expansion", 
"Contraction", "Expansion", "Contraction", "Expansion")), row.names = c(1L, 
2L, 3L, 5L, 8L), class = "data.frame")

【问题讨论】:

    标签: r dataframe dplyr conditional-statements


    【解决方案1】:

    您可以使用leadlag 来检查上一个和下一个值:

    library(dplyr)
    
    df %>%
      filter(State == 'Expansion' & lead(State) == 'Contraction' | 
             State == 'Contraction' & lag(State) == 'Expansion')
    
    #        Date         LC       State
    #1 1978-01-01  2148.5503   Expansion
    #2 1980-01-01   997.8638 Contraction
    #3 2019-01-01  5931.9648   Expansion
    #4 1990-01-01 -5317.8295 Contraction
    #5 2010-01-01 -1558.7331   Expansion
    #6 2011-01-01 -2262.7693 Contraction
    

    【讨论】:

      【解决方案2】:

      也许,我们可以filter 基于 'State' 的 run-length-id 上的重复项

      library(dplyr)
      library(data.table)
      df %>%
            filter(!duplicated(rleid(State)))
      

      【讨论】:

        猜你喜欢
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-18
        • 2019-04-19
        • 2021-01-04
        • 1970-01-01
        相关资源
        最近更新 更多