data.frame を 1 回繰り返すのは簡単です。
mt2 <- rbind(mtcars, mtcars)
しかし、これを一般的に行うRのような方法は何ですか? mtcars
一緒に10枚欲しいなら
mt10 <- mtcars
for (i in 2:10) mt10 <- rbind(mt10, mtcars)
これは非常に簡潔ですが、R の精神ではないようです。これを行うためのより良い方法、またはベクトルのリサイクルを使用した巧妙なトリックはありますか?
これは非常に簡単な方法です:
mtcars[rep(1:nrow(mtcars),2),]
またはより良い「文法」を使用する:
mtcars[rep(seq_len(nrow(mtcars)),2),]
GSee が以下に記しているように、ここでの 1 つの違いはrbind
、行名を正確に複製することですが、インデックスを使用すると、数字を追加することによって一意の行名が強制されます。頭のてっぺんから、唯一の修正は、事後に行名を設定すること(再び を使用rep
すること)だと思います。
@joranの答えは非常にエレガントであり、行名を複製する必要がない場合はそれを使用する必要があります。ただし、この方法では行名も複製されます。
do.call(rbind, replicate(10, mtcars[1:10, ], simplify=FALSE))
別のパッケージを許容できる場合:
require(mefa)
rep(mtcars,10)
少し速く表示されます。
system.time(mtcars[rep(1:nrow(mtcars),1e5),])
system.time(mtcars[rep(seq_len(nrow(mtcars)),1e5),])
system.time(rep(mtcars,1e5))
与えます:
user system elapsed
17.41 0.19 17.89
17.11 0.31 17.91
6.79 0.70 7.67
警告: 1) 担当者は行名を再現しません。これは別のステップです。2)mefa::rep(mtcars,10)
次のようには機能しませんError: 'rep' is not an exported object from 'namespace:mefa'
。もmefa:::rep(mtcars,10)
与えobject 'rep' not found
ます。これがなぜなのかわかりません...