【问题标题】:Modification of a Vector based on elements sequence基于元素序列的向量修改
【发布时间】:2018-05-10 20:43:02
【问题描述】:

如何转换以下向量:

x <- c(0, 0, 0, 1, 0, 3, 2, 0, 0, 0, 5, 0, 0, 0, 8)

变成想要的形式:

y <- c(1, 1, 1, 1, 3, 3, 2, 5, 5, 5, 5, 8, 8, 8, 8)

任何想法都将受到高度赞赏。

【问题讨论】:

    标签: r vector transformation


    【解决方案1】:

    您可以使用zoo通过na.locf函数填充NAs,如下所示,

    zoo::na.locf(replace(x, x==0, NA), fromLast = TRUE)
    #[1] 1 1 1 1 3 3 2 5 5 5 5 8 8 8 8
    

    【讨论】:

      【解决方案2】:

      使用rle,您可以在base R中执行以下操作。

      tmp <- rle(x)
      tmp$values[which(tmp$values == 0)] <- tmp$values[which(tmp$values == 0) + 1L]
      
      inverse.rle(tmp)
       [1] 1 1 1 1 3 3 2 5 5 5 5 8 8 8 8
      

      请注意,这假定最终值不是 0。如果不是这种情况,您可以使用 head(which(tmp$values == 0), -1) 代替 which(tmp$values == 0) 来删除最终值。

      【讨论】:

        【解决方案3】:

        这是另一种仅使用基础 R 的方法:

        idx <- x != 0
        split(x, cumsum(idx) - idx) <- x[idx]
        

        x 向量现在是:

        x
        #[1] 1 1 1 1 3 3 2 5 5 5 5 8 8 8 8
        

        【讨论】:

        • 绝妙的解决方案!
        猜你喜欢
        • 2011-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-03
        • 1970-01-01
        • 2018-05-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多