2015-04-20 43 views
2

我想使用下面的代碼在我的數據框中複製行。 但是,我發現它很慢。R中的數據幀中的重複行

duprow = df[1,] 
for(i in 1:2000) 
{ 
    print(i) 
    df = rbind(df,duprow) 
} 

有沒有更快的方法?

回答

3

您可以使用rep,例如, 5次重複或行1:

df <- data.frame(x = 1, y = 1) 
rbind(df, df[rep(1, 5), ]) 
#  x y 
# 1 1 1 
# 11 1 1 
# 1.1 1 1 
# 1.2 1 1 
# 1.3 1 1 
# 1.4 1 1 
2

使用rep()盧克的回答做你的工作,現在,但低於這些答案也許能夠幫助你從長遠來看。

  1. 請看一看這個答案上speeding up rbind爲什麼它是緩慢的,不使用循環。它還有預先分配數據幀的代碼。另請參閱Jorans Second circle of hell comment

  2. 建議rbind.fill從@coanil

    兩件事情我想補充:1)一般情況下,如果你不希望使用data.table,您可以使用rbind 。在Hadley的plyr軟件包中填充函數也很快。永遠不要像上面那樣在'for'循環中使用rbind,而是分別添加每行。它強制R在每次追加一行時創建數據框對象的副本,而且速度很慢。

https://stackoverflow.com/a/19699342/4606130

  • 如果去data.table路線,然後使用rbindlist這是更快。 (@David在第一個回答鏈接中提出了這個問題。)
  • 3

    昨天我有類似的問題,還有一個叫'splitstackshape'的軟件包。然後,它是如下面的代碼一樣簡單:

    library(splitstackshape) 
    df <- data.frame(x = 1, y = 1) 
    df2 <- expandRows(df, count=2000, count.is.col=FALSE) 
    

    您可能還需要「修復」的rownames做

    rownames(df2) <- 1:2000 
    
    +0

    我通常只是用'rownames(DF2)< - NULL'實現同樣的效果。或者,如果輸入是'data.table',則不會有行開頭的行名稱。例如:'expandRows(as.data.table(df),count = 2000,count.is.col = FALSE)' – A5C1D2H2I1M1N2O1R2T1