【问题标题】:Replace repeating values with 0用 0 替换重复值
【发布时间】:2019-04-18 23:37:24
【问题描述】:

我想用 0 替换我的数据框中的重复值。允许重复一些次数。

a<-c(1,2,3,4,4,4,5,5,5,5,5,9,9,150,220,220)

如果允许的重复次数是 4,则预期的解决方案应如下所示:

a_new<-c(1,2,3,4,4,4,0,0,0,0,0,9,9,150,220,220)

超过 4 次的重复值被替换为 0。

使用 rle

b<-rle(a)

我可以识别重复次数

Run Length Encoding
  lengths: int [1:8] 1 1 1 3 5 2 1 2
  values : num [1:8] 1 2 3 4 5 9 150 220

并将其替换为 0

b$values[b$lengths>4]<-0

Run Length Encoding
  lengths: int [1:8] 1 1 1 3 5 2 1 2
  values : num [1:8] 1 2 3 0 0 9 150 220

问题是如何在这种情况下将重复插入 0 回数据中。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用inverse.rle

    a_new<-c(1,2,3,4,4,4,0,0,0,0,0,9,9,150,220,220)
    
    b <- rle(a_new)
    
    b$values[b$lengths>4]<-0
    
    inverse.rle(b)
    
    [1]   1   2   3   4   4   4   0   0   0   0   0   9   9 150 220 220
    

    【讨论】:

    • Inverse.rle 正是我想要的
    【解决方案2】:

    你也可以用一行来实现这一点

    with(rle(a), rep(values * (lengths <= 4), lengths))
    # [1]   1   2   3   4   4   4   0   0   0   0   0   9   9 150 220 220
    

    这样我们在rle(a)内部操作,直接对inverse.rle进行修改:

    inverse.rle
    # function (x, ...) 
    # {
    #     if (is.null(le <- x$lengths) || is.null(v <- x$values) || 
    #         length(le) != length(v)) 
    #         stop("invalid 'rle' structure")
    #     rep.int(v, le) # The same except for le <= 4
    # }
    # <bytecode: 0x10470b4a8>
    # <environment: namespace:base>
    

    【讨论】:

      【解决方案3】:

      另一种方式通过ave

      a[ave(a, a, FUN = length) > 4] <- 0
      a
      #[1]   1   2   3   4   4   4   0   0   0   0   0   9   9 150 220 220
      

      【讨论】:

      • rle 我认为很重要。对于这个a&lt;-c(1, 1, 2,3,4,4,4,5,5,5,5,5,9,9,150,1, 1, 1),它会错误地将 1 转换为 0。
      • 其实不清楚。 OP 说重复但随后尝试使用rle。我会留下来,直到他们澄清
      【解决方案4】:

      还有一种可能:

      (a != rle(a)$values[rle(a)$lengths > 4]) * a
      
       [1]   1   2   3   4   4   4   0   0   0   0   0   9   9 150 220 220
      

      【讨论】:

        【解决方案5】:

        rleid

        library(data.table)
        data.table(a)[, a1 := if(.N >4) 0 else a, rleid(a)]$a1
        #[1]   1   2   3   4   4   4   0   0   0   0   0   9   9 150 220 220
        

        【讨论】:

          猜你喜欢
          • 2021-06-27
          • 2019-10-02
          • 2021-06-09
          • 1970-01-01
          • 2016-11-02
          • 1970-01-01
          • 2018-03-12
          • 2020-11-19
          • 1970-01-01
          相关资源
          最近更新 更多