4

data.frame を 1 回繰り返すのは簡単です。

mt2 <- rbind(mtcars, mtcars)

しかし、これを一般的に行うRのような方法は何ですか? mtcars一緒に10枚欲しいなら

mt10 <- mtcars
for (i in 2:10) mt10 <- rbind(mt10, mtcars)

これは非常に簡潔ですが、R の精神ではないようです。これを行うためのより良い方法、またはベクトルのリサイクルを使用した巧妙なトリックはありますか?

4

4 に答える 4

8

これは非常に簡単な方法です:

mtcars[rep(1:nrow(mtcars),2),]

またはより良い「文法」を使用する:

mtcars[rep(seq_len(nrow(mtcars)),2),]

GSee が以下に記しているように、ここでの 1 つの違いはrbind、行名を正確に複製することですが、インデックスを使用すると、数字を追加することによって一意の行名が強制されます。頭のてっぺんから、唯一の修正は、事後に行名を設定すること(再び を使用repすること)だと思います。

于 2012-11-07T17:50:31.633 に答える
6

@joranの答えは非常にエレガントであり、行名を複製する必要がない場合はそれを使用する必要があります。ただし、この方法では行名も複製されます。

do.call(rbind, replicate(10, mtcars[1:10, ], simplify=FALSE))

于 2012-11-07T17:59:48.150 に答える
3

別のパッケージを許容できる場合:

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ます。これがなぜなのかわかりません...

于 2012-11-09T21:53:27.730 に答える