110

data.frameの行を毎回繰り返したいN。結果は、列のデータ型を保持する新しいdata.frame(with )になるはずです。nrow(new.df) == nrow(old.df) * N

N = 2の例:

                        A B   C
  A B   C             1 j i 100
1 j i 100     -->     2 j i 100
2 K P 101             3 K P 101
                      4 K P 101

したがって、各行は2回繰り返され、文字は文字のまま、係数は係数のまま、数値は数値のまま、...

私が最初に使用した試みはapply:apply(old.df, 2, function(co) rep(co, each = N))ですが、これは私の値を文字に変換し、次のようになります。

     A   B   C    
[1,] "j" "i" "100"
[2,] "j" "i" "100"
[3,] "K" "P" "101"
[4,] "K" "P" "101"
4

10 に答える 10

158
df <- data.frame(a = 1:2, b = letters[1:2]) 
df[rep(seq_len(nrow(df)), each = 2), ]
于 2012-06-20T14:09:10.623 に答える
11

全体を繰り返すか、最初にサブセット化してから繰り返すことができる場合は、この同様の質問が役立つ場合があります。もう一度:

library(mefa)
rep(mtcars,10) 

または単に

mefa:::rep.data.frame(mtcars)
于 2013-04-24T22:20:31.443 に答える
6

mefa を引用した回答への参照と追加についてmefa::rep.data.frame()は、パッケージ全体を含めたくない場合に備えて、の実装を検討する価値があります。

> data <- data.frame(a=letters[1:3], b=letters[4:6])
> data
  a b
1 a d
2 b e
3 c f
> as.data.frame(lapply(data, rep, 2))
  a b
1 a d
2 b e
3 c f
4 a d
5 b e
6 c f
于 2015-07-21T18:53:13.803 に答える
5

rep.row 関数は時々列のリストを作成するようで、これが悪いメモリ ハイジンクにつながります。私はうまくいくと思われる次のことを書きました:

library(plyr)
rep.row <- function(r, n){
  colwise(function(x) rep(x, n))(r)
}
于 2013-05-30T18:31:28.233 に答える
3

私のソリューションは と似てmefa:::rep.data.frameいますが、少し速く、行名を気にします:

rep.data.frame <- function(x, times) {
    rnames <- attr(x, "row.names")
    x <- lapply(x, rep.int, times = times)
    class(x) <- "data.frame"
    if (!is.numeric(rnames))
        attr(x, "row.names") <- make.unique(rep.int(rnames, times))
    else
        attr(x, "row.names") <- .set_row_names(length(rnames) * times)
    x
}

ソリューションの比較:

library(Lahman)
library(microbenchmark)
microbenchmark(
    mefa:::rep.data.frame(Batting, 10),
    rep.data.frame(Batting, 10),
    Batting[rep.int(seq_len(nrow(Batting)), 10), ],
    times = 10
)
#> Unit: milliseconds
#>                                            expr       min       lq     mean   median        uq       max neval cld
#>              mefa:::rep.data.frame(Batting, 10) 127.77786 135.3480 198.0240 148.1749  278.1066  356.3210    10  a 
#>                     rep.data.frame(Batting, 10)  79.70335  82.8165 134.0974  87.2587  191.1713  307.4567    10  a 
#>  Batting[rep.int(seq_len(nrow(Batting)), 10), ] 895.73750 922.7059 981.8891 956.3463 1018.2411 1127.3927    10   b
于 2016-03-01T17:15:23.940 に答える
1

たとえば、使用してみてください

N=2
rep(1:4, each = N) 

指標として

于 2012-06-20T14:09:15.107 に答える
0

これを行う別の方法は、最初に行インデックスを取得し、df の余分なコピーを追加してから、インデックスで並べ替えます。

df$index = 1:nrow(df)
df = rbind(df,df)
df = df[order(df$index),][,-ncol(df)]

他のソリューションの方が短い場合もありますが、特定の状況ではこの方法の方が有利な場合があります。

于 2015-06-03T12:07:56.870 に答える