【问题标题】:R efficient looping suggestionR 高效循环建议
【发布时间】:2012-07-09 06:19:32
【问题描述】:

我有一个大约 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]))
}

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

感谢回复

【问题讨论】:

    标签: r loops dataframe


    【解决方案1】:

    您根本不需要循环。 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
    

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

    【讨论】:

    • @AdityaSihag 欢迎您。如果这解决了您的问题,我建议您接受答案(然后问题会改变颜色并且人们知道已经提供了可接受的答案)。
    猜你喜欢
    • 2021-09-15
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2016-01-03
    相关资源
    最近更新 更多