2012-07-09 40 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