0

我有一个大约 500,000 行的数据框。其中一列包含正整数值,例如列 A。假设有另一列 B

我现在需要创建第二个数据帧,其行数等于 sum(dataframe$A)。这个完成了。

当我需要用数据填充这个新数据框时,就会出现性能问题。我正在尝试为第二帧创建一个 A2 列,如下所示:

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

对于正在处理的大量行,外部循环显然非常慢。有关如何以更快的处理速度完成此任务的任何建议。

感谢您的回复

4

1 回答 1

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

这将比使用循环快几个数量级。

于 2012-07-09T06:26:08.090 回答