2012-06-20 39 views
49

我想重複一行data.frame,每行N次。結果應該是一個新的data.frame(與nrow(new.df) == nrow(old.df) * N)保留列的數據類型。對於N重複一行data.frame

實施例= 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(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" 
+0

的可能的複製[重複data.frame N次(http://stackoverflow.com/questions/8753531/repeat-data-frame-n-times採取) –

回答

84
df <- data.frame(a=1:2, b=letters[1:2]) 
df[rep(seq_len(nrow(df)), each=2),] 
+12

您可以使用'n.times <-c(2,4); df [rep(seq_len(nrow(df)),n×)]'如果你想改變每一行重複的次數。 –

4

如果你可以重複整個事情,或子集它首先然後重複這一點,那麼this similar question可能會有所幫助。再次聲明:

library(mefa) 
rep(mtcars,10) 

或者乾脆

mefa:::rep.data.frame(mtcars) 
+6

啊哈!另一個輝煌的R功能隱藏在一個完全不相關的名字的不安全專家包內。我喜歡這種語言! – smci

4

的rep.row功能似乎有時會列出列,從而導致記憶力不好hijinks。我寫這似乎運作良好的情況如下:

library(plyr) 
rep.row <- function(r, n){ 
    colwise(function(x) rep(x, n))(r) 
} 
3

添加到什麼@dardisco提及mefa::rep.data.frame(),這是非常靈活的。

您可以重複每一行N次

rep(df, each=N) 

重複整個數據幀N次(認爲:當您回收量化參數等)

rep(df, times=N) 

兩個豎起大拇指給mefa!直到現在,我從來沒有聽說過它,我必須編寫手動代碼才能做到這一點。

0

另一種方式來做到這一點會先取得行索引,通過索引追加DF額外的副本,然後順序:

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

雖然其他的解決方案可能會更短,這種方法可能會更在某些情況下有利。

3

參考,增加了答案援引間位,可能值得采取的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 
1

我的解決方案爲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 
3

乾淨dplyr溶液,從here

library(dplyr) 
df <- data_frame(x = 1:2, y = c("a", "b")) 
df %>% slice(rep(1:n(), each = 2))