如何将向量中的值复制到向量中的下一个位置

Rob*_*ob 5 r vector

我有一个看起来像这样的矢量:

c(0.5,0,0,0,0,0.7,0,0,0,0,0.4,0,0,0,0)
Run Code Online (Sandbox Code Playgroud)

假设我想将位置1,6和11(非0的位置)的值复制到该特定值之后的四个位置,以使向量看起来像这样:

c(0.5,0.5,0.5,0.5,0.5,0.7,0.7,0.7,0.7,0.7,0.4,0.4,0.4,0.4,0.4)
Run Code Online (Sandbox Code Playgroud)

我怎么能在R中做到最好?

非常感谢!

Rol*_*and 8

另一种可能性

vec <- c(0.5,0,0,0,0,0.7,0,0,0,0,0.4,0,0,0,0)

library(zoo)
vec[vec==0] <- NA
na.locf(vec)
#[1] 0.5 0.5 0.5 0.5 0.5 0.7 0.7 0.7 0.7 0.7 0.4 0.4 0.4 0.4 0.4
Run Code Online (Sandbox Code Playgroud)


Mat*_*rde 6

这是一种方式:

zero.locf <- function(x) {
    if (x[1] == 0) stop('x[1] should not be 0')
    with(rle(x), {
        no.0 <- replace(values, values == 0, values[(values == 0) - 1])
        rep(no.0, lengths)
    })
}
x <- c(0.5,0,0,0,0,0.7,0,0,0,0,0.4,0,0,0,0)
zero.locf(x)
#  [1] 0.5 0.5 0.5 0.5 0.5 0.7 0.7 0.7 0.7 0.7 0.4 0.4 0.4 0.4 0.4
Run Code Online (Sandbox Code Playgroud)

rle(x)返回list带有项目valueslengths.

rle(x)
Run Length Encoding
  lengths: int [1:6] 1 4 1 4 1 4
  values : num [1:6] 0.5 0 0.7 0 0.4 0
Run Code Online (Sandbox Code Playgroud)

with打开这个list并让我们直接引用这些条目.


fde*_*sch 2

我可能会使用 循环遍历每个大于 0 的元素lapply,然后应用rep函数重复每个值 5 次,并通过 合并结果列表条目do.call("c", ...)

do.call("c", lapply(which(tmp > 0), function(i) rep(tmp[i], 5)))
[1] 0.5 0.5 0.5 0.5 0.5 0.7 0.7 0.7 0.7 0.7 0.4 0.4 0.4 0.4 0.4
Run Code Online (Sandbox Code Playgroud)