给出诸如
之类的向量> x
[1] 1 1 2 1 1 1 5 1 1 1 5 7 1 1 1 1 1 1 1 1 1
我想复制元素n次 - 但是 - 我希望复制覆盖旧元素。 使用基本的rep函数给出:
> rep(x,x)
[1] 1 1 2 2 1 1 1 5 5 5 5 5 1 1 1 5 5 5 5 5 7 7 7 7 7 7 7 1 1 1 1 1 1 1 1 1
这只是将原始未移位的相邻元素向右移动。 但是,如果我要反复覆盖每个相邻的元素 复制值(这里一步一步地用每个元素从左到右替换),我会有类似......
112111511157111111111
112211511157111111111
112211555557111111111
112211555555555111111
112211555557777777111
注意,对于每N次复制元素,它只会覆盖N个相邻的右邻居。我可以在一个循环中完成这个,但是有一个基于快速向量的方法吗?
na.locf是关闭的(预设1s到NA),但是(据我所知),它将只用最大值填充ALL或固定数量的最右边的NAs,而不是恰好N个右邻居。
一种可能的替代方法是将所有零置于原始零的位置,并且仅使用二进制1值重复和覆盖元素N次。 例如以上就是...... 例如:
x<- c(0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0)
sig<-c(0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0)
编辑:澄清一下,它应该紧凑地扩展到任意数量的可重复元素 (与rep功能相同)。
答案 0 :(得分:1)
y <- x
for (i in unique(y)) { # or perhaps sort(unique(y))
for (j in which(y==i)) {
x[seq(j, length.out=i)] <- i
}
}
x
## [1] 1 1 2 2 1 1 5 5 5 5 5 7 7 7 7 7 7 7 1 1 1
答案 1 :(得分:0)
x <- c(0, 0, 2, 0, 0, 0, 5, 0, 0, 0, 5, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0)
dumFun <- function(a,b,c){rep(c(0,1,0), times = c(a-1,b,max(c-b-a+1,0)))}
1*Reduce('|',
mapply(dumFun, a = seq_along(x), b = x, c =length(x), SIMPLIFY= FALSE))
[1] 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0
这将生成一个0的向量列表,按x填充1。然后,它将OR运算连续应用于列表的每个元素。
我们可以将它包装在一个函数中:
getSignal <- function(x){
dumFun <- function(a,b,c){
rep(c(0,1,0), times = c(a,b,max(c-b-a,0)))
}
1*Reduce('|',
mapply(dumFun, a = seq_along(x)-1, b = x, c =length(x),
SIMPLIFY= FALSE))
}
我们也可以应用类似的想法来处理第一个问题:
getRep <- function(x){
dumFun <- function(a,b,c){
rep(c(0,b,0), times = c(a,b,max(c-b-a,0)))
}
Reduce('pmax',
mapply(dumFun, a = seq_along(x)-1, b = x, c =length(x),
SIMPLIFY= FALSE))
}
y <- c(1, 1, 2, 1, 1, 1, 5, 1, 1, 1, 5, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1)
getRep(y)
[1] 1 1 2 2 1 1 5 5 5 5 5 7 7 7 7 7 7 7 1 1 1