どうすれば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)
しかし、それは機能しません。
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
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
これは最も美しいコード行ではありませんが、次のようなものでも機能するはずです。
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
元の長さの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
私がこれのために書いた愚かな機能、いくつかのカスタマイズ可能な機能:
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)
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