我想使用下面的代碼在我的數據框中複製行。 但是,我發現它很慢。R中的數據幀中的重複行
duprow = df[1,]
for(i in 1:2000)
{
print(i)
df = rbind(df,duprow)
}
有沒有更快的方法?
我想使用下面的代碼在我的數據框中複製行。 但是,我發現它很慢。R中的數據幀中的重複行
duprow = df[1,]
for(i in 1:2000)
{
print(i)
df = rbind(df,duprow)
}
有沒有更快的方法?
您可以使用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
使用rep()
盧克的回答做你的工作,現在,但低於這些答案也許能夠幫助你從長遠來看。
請看一看這個答案上speeding up rbind爲什麼它是緩慢的,不使用循環。它還有預先分配數據幀的代碼。另請參閱Jorans Second circle of hell comment。
建議rbind.fill從@coanil
兩件事情我想補充:1)一般情況下,如果你不希望使用data.table,您可以使用rbind 。在Hadley的plyr軟件包中填充函數也很快。永遠不要像上面那樣在'for'循環中使用rbind,而是分別添加每行。它強制R在每次追加一行時創建數據框對象的副本,而且速度很慢。
https://stackoverflow.com/a/19699342/4606130
data.table
路線,然後使用rbindlist這是更快。 (@David在第一個回答鏈接中提出了這個問題。)昨天我有類似的問題,還有一個叫'splitstackshape'的軟件包。然後,它是如下面的代碼一樣簡單:
library(splitstackshape)
df <- data.frame(x = 1, y = 1)
df2 <- expandRows(df, count=2000, count.is.col=FALSE)
您可能還需要「修復」的rownames做
rownames(df2) <- 1:2000
我通常只是用'rownames(DF2)< - NULL'實現同樣的效果。或者,如果輸入是'data.table',則不會有行開頭的行名稱。例如:'expandRows(as.data.table(df),count = 2000,count.is.col = FALSE)' – A5C1D2H2I1M1N2O1R2T1