基于元素序列修改 Vector
Modification of a Vector based on elements sequence
如何转换以下向量:
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)
任何想法将不胜感激。
您可以使用 zoo
通过 na.locf
函数填充 NA,如下所示,
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
使用 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)
来删除最终值。
这是另一种仅使用基础 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
如何转换以下向量:
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)
任何想法将不胜感激。
您可以使用 zoo
通过 na.locf
函数填充 NA,如下所示,
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
使用 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)
来删除最终值。
这是另一种仅使用基础 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