2

我怎样才能转换A

A <- c(1,2,3,4,5,6,7,8,9)

到乙

B <- c(0,0,1,2,3,0,0,4,5,6,0,0,7,8,9)

我试过这个:

A <-c(1,2,3,4,5,6,7,8,9)
rows <- length(A)/3
dim(a) <- c(rows,3)
B <- matrix(0,rows,2+3)
B[,3:5] <- A

c(B)

但它不起作用。

4

6 回答 6

6

为什么不将 B 转换为 A:

b <- rep(c(0,0,1,1,1),time=length(A)/3)
b[b==1] <- A
b
[1] 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9
于 2012-12-16T18:02:45.287 回答
3

这不是最漂亮的代码行,但这样的东西也应该起作用:

as.vector(sapply(split(A, rep(1:(length(A)/3), each = 3)), 
                 function(x) c(0, 0, x)))
# [1] 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9

首先,我们将向量拆分为 3 个集合,然后在每个集合中附加两个零,然后将其重新转换为向量。


更新

这是一种可能类似于您考虑的过程的方法:

A <- c(1,2,3,4,5,6,7,8,9)      # Your vector
dim(A) <- c(3, 3)              # As a matrix
B <- matrix(0, nrow=5, ncol=3) # An empty matrix to fill
B[c(3:5), ] <- A               # We only want to fill these rows
dim(B) <- NULL                 # Remove the dims to get back to a vector
B                              # View your handiwork
# [1] 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9
于 2012-12-16T17:32:58.710 回答
3

将接收向量构建为原始长度的 5/3,并填写用模算术计算的正确整数:

> bb <- vector(length= length(A)*1.67) # Will initially be logical vector
> bb[ !seq_along(bb) %% 5 %in% 1:2 ] <- A    # FALSE entries coerced to 0
> bb
 [1] 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9

模余数 3,4 和 0 处的位置依次填充 A 中的值。

这是另一个矢量化解决方案,可能更符合您之前努力的精神:

> c( rbind( matrix(0, nrow=2, ncol=length(A)/3), 
      matrix(A, nrow=3) ) )
 [1] 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9

这表明您的解决方案是正确的,除了在您应该在矩阵分配的 LHS 上使用行索引时使用列索引:

> B <- matrix(0, 5, 3)
> B[3:5, ] <- A
> B
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    1    4    7
[4,]    2    5    8
[5,]    3    6    9
> c(B)
 [1] 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9
于 2012-12-16T17:48:12.737 回答
3

假设 A 具有非零长度且长度可被 3 整除:

> c(vapply(seq(length(A)/3)-1,
           function(x) c(0,0,A[(x*3+1):(x*3+3)]),
           numeric(3+2)
          )
   )
 [1] 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9
于 2012-12-16T17:16:45.557 回答
2

我为此编写的愚蠢功能,具有一些可定制的功能:

PastingZeros <- function (divide = 3, data = A, amountofzeros = 2) {
  B     <- NULL
  n     <- length(data)
  index <- 1:n

  for (i in 1:(n / divide)) {
    B     <- c(B, rep(0, amountofzeros), data[index[1:divide]])
    index <- index[-1:-divide]
  }
  return(B)
}

PastingZeros(3, A, 0)
于 2012-12-16T18:02:49.150 回答
2

我没有看到一个不假设A长度是 的倍数的解决方案3,所以我会抛出一个:

insert.every <- function(x, insert, every)
    unlist(lapply(split(x, (seq_along(x)-1) %/% every), append, x = insert),
           use.names = FALSE)

insert.every(1:9, c(0,0), 3)
# [1] 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9
insert.every(1:9, c(0,0), 4)
# [1] 0 0 1 2 3 4 0 0 5 6 7 8 0 0 9
于 2012-12-16T19:00:35.697 回答