我有一个看起来像这样的矢量:
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中做到最好?
非常感谢!
另一种可能性
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)
这是一种方式:
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带有项目values和lengths.
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并让我们直接引用这些条目.
我可能会使用 循环遍历每个大于 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)