2012-07-09 38 views
0

我有一個數據框運行到大約500,000行。其中一列包含正整數值,比如說A列。假設有另一列BR有效的循環建議

我現在需要創建第二個數據行,其行數等於sum(數據框$ A)。這個做完了。

當我需要用數據填充這個新數據框時,會出現性能問題。我想這個第二幀創建一個列A2如下:

A2<-vector() 
for (i in 1:nrow(dataframe)){ 
    A2<-c(A2,rep(dataframe$B[i],dataframe$A[i])) 
} 

外部環路顯然是非常慢的被處理的大量行。有關如何以更快的處理完成此任務的任何建議。

感謝您的回覆

回答

4

根本就不需要循環。已經向量化了rep

A2 <- rep(dataframe$B, dataframe$A) 

應該工作。作爲一個可重複的例子,這裏使用內置的mtcars數據集。

x <- vector() 
for(i in 1:nrow(mtcars)) {x <- c(x, rep(mtcars$cyl[i], mtcars$gear[i]))} 
> x 
    [1] 6 6 6 6 6 6 6 6 4 4 4 4 6 6 6 8 8 8 6 6 6 8 8 8 4 4 4 4 4 4 4 4 6 6 6 6 6 
[38] 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 8 
[75] 8 8 8 8 8 8 8 8 8 8 8 4 4 4 4 4 4 4 4 4 4 4 4 4 4 8 8 8 8 8 6 6 6 6 6 8 8 
[112] 8 8 8 4 4 4 4 

和量化,它是:

x2 <- rep(mtcars$cyl, mtcars$gear) 
> x2 
    [1] 6 6 6 6 6 6 6 6 4 4 4 4 6 6 6 8 8 8 6 6 6 8 8 8 4 4 4 4 4 4 4 4 6 6 6 6 6 
[38] 6 6 6 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 8 
[75] 8 8 8 8 8 8 8 8 8 8 8 4 4 4 4 4 4 4 4 4 4 4 4 4 4 8 8 8 8 8 6 6 6 6 6 8 8 
[112] 8 8 8 4 4 4 4 

這將是數量級比使用一個循環更快。

+0

太棒了,謝謝你很多 – 2012-07-09 06:45:20

+0

@AdityaSihag歡迎您。如果這解決了你的問題,我建議你接受答案(然後問題改變顏色,人們知道一個可接受的答案已經提供)。 – Joshua 2012-07-12 14:21:58