3

给定一个向量,例如

> 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(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),但是(据我所知)它将用 rep 值填充 ALL 或仅最右边的固定数量的 NA,而不是恰好 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 函数相同)。

4

2 回答 2

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
于 2013-05-30T02:38:48.123 回答
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

这将生成一个由 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
于 2013-05-30T02:16:07.470 回答