2

どうすればAを変換できますか

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

Bへ

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

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 に答える
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つのセットに分割し、次に各セットに2つのゼロを追加して、ベクトルに再変換します。


アップデート

これはおそらくあなたが考えていたプロセスに似ているアプローチです:

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 に答える
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ので、次の1つをスローします。

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 に答える