代码之家  ›  专栏  ›  技术社区  ›  And_R

基于元素序列的向量修改

  •  6
  • And_R  · 技术社区  · 6 年前

    如何变换以下向量:

    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)
    

    任何想法都将不胜感激。

    3 回复  |  直到 6 年前
        1
  •  3
  •   talat    6 年前

    下面是另一种仅使用基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
    
        2
  •  3
  •   Sotos    6 年前

    您可以使用 zoo 通过以下方式填充NAs na.locf 功能如下,

    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
    
        3
  •  2
  •   lmo    6 年前

    使用 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) 删除最终值。