【问题标题】:Remove identical values if the same as previous in a time series如果与时间序列中的前一个值相同,则删除相同的值
【发布时间】:2020-05-09 17:40:58
【问题描述】:

我有一个时间序列:

 df <- data.frame(t=1:10, x= c(5,7,8,9,5,5,5,5,4,3))

我想删除与前一个值相同的值来获取:

 x = c(5,7,8,9,5,4,3)

我试过了:

 df[unique(df$x),]

但这给出了错误的答案。

【问题讨论】:

    标签: r dataframe duplicates subset


    【解决方案1】:

    你可以这样做:

    df[c(1, diff(df$x)) != 0, ] 
    
       t x
    1  1 5
    2  2 7
    3  3 8
    4  4 9
    5  5 5
    6  9 4
    7 10 3
    

    【讨论】:

      【解决方案2】:

      使用dplyr,您可以:

      df %>%
       filter(x != lag(x, default = first(x)-1))
      
         t x
      1  1 5
      2  2 7
      3  3 8
      4  4 9
      5  5 5
      6  9 4
      7 10 3
      

      【讨论】:

        【解决方案3】:

        在base R中,我们可以使用head和tail

        subset(df, c(TRUE, head(x, -1) != tail(x, -1)))
        
        #    t x
        #1   1 5
        #2   2 7
        #3   3 8
        #4   4 9
        #5   5 5
        #9   9 4
        #10 10 3
        

        【讨论】:

        • @ZhiqiangWang 应该有。再次阅读问题。
        • 虽然输出中应该有 2 个 5,但答案需要一些调整。谢谢。
        【解决方案4】:

        另一个base 解决方案是使用rle。

        如果您想根据条件对数据框进行子集化,可以使用lengths。否则,如果您只需要x 列的子集,我们应该从rle 中提取值。见下文;

        df[cumsum(rle(df$x)$lengths), ] # dataframe subset
        
        #     t x
        # 1   1 5
        # 2   2 7
        # 3   3 8
        # 4   4 9
        # 8   8 5
        # 9   9 4
        # 10 10 3
        
        rle(df$x)$values # vector of values
        
        # [1] 5 7 8 9 5 4 3
        


        或者使用data.table:

        library(data.table)
        
        setDT(df_large)[, rn :=1:.N, by = rleid(x)][rn == 1, .(t, x)]
        
         #     t x
         # 1:  1 5
         # 2:  2 7
         # 3:  3 8
         # 4:  4 9
         # 5:  5 5
         # 6:  9 4
         # 7: 10 3
        

        【讨论】:

          【解决方案5】:
          library(dplyr)    
          
          df <- data.frame(t=1:10, x= c(5,7,8,9,5,5,5,5,4,3))
          
          subsetVec <- df$x - lag(df$x) != 0
          subsetVec <- replace_na(subsetVec, TRUE)
          df[subsetVec,]
          

          【讨论】:

            猜你喜欢
            • 2022-08-11
            • 1970-01-01
            • 1970-01-01
            • 2018-11-26
            • 1970-01-01
            • 2018-05-08
            • 2018-01-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多