6

と との 2 つのベクトルがv1ありv2、 を呼び出したいとしますrbind(v1, v2)。ただし、想定length(v1)> length(v2)。ドキュメントから、短いベクトルがリサイクルされることを読みました。この「リサイクル」の例を次に示します。

v1 <- c(1, 2, 3, 4, 8, 5, 3, 11)
v2 <- c(9, 5, 2)
rbind(v1, v2)
#    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# v1    1    2    3    4    8    5    3   11
# v2    9    5    2    9    5    2    9    5
  1. v2リサイクルを停止し、代わりに残りのエントリを 0 にする簡単な方法はありますか?
  2. ベクトルと行列を構築するより良い方法はありますか?

すべてのヘルプは大歓迎です!

4

4 に答える 4

4

リカルドは素晴らしい解決策を提供してくれたと思いますが、バインドしたいベクトルのリストに関数を適用することもできます。入力する文字を指定することもできます。

test <- list(v1,v2)
maxlen <- max(sapply(test,length))
fillchar <- 0
do.call(rbind,lapply(test, function(x) c(x, rep(fillchar, maxlen - length(x) ) )))

do.call(rbindまたは、すべての狂気を回避します。

t(sapply(test, function(x) c(x, rep(fillchar, maxlen - length(x)))))

#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#[1,]    1    2    3    4    8    5    3   11
#[2,]    9    5    2    0    0    0    0    0
于 2013-05-15T05:52:29.907 に答える
3

rbindより長いベクトルとより短いベクトルを見つけるためのベクトルが多数ある場合、退屈になる可能性があります。その場合、これはオプションです:

require(plyr)

rbind.fill.matrix(t(v1), t(v2))

また、

rbind.fill(as.data.frame(t(v1)), as.data.frame(t(v2)))
于 2013-05-15T04:22:40.637 に答える