首页 > 解决方案 > R;对于百万向量的循环太慢了

问题描述

我正在使用数据表进行管理。我有 13 * 2598893 数据表,我正在尝试使用基于另一列计算的字符填充新列。所以我制作了一个函数,并将其应用于具有数百万行的“for in”循环。它需要永远!我等了几分钟,我无法将它与系统故障区分开来。

我只尝试了 10 行,循环和函数运行得很快。但是当我将它扩展到其他行时,它又需要永远。

str(eco)
'data.frame':   2598893 obs. of  13 variables:

制作这样的功能

check<-function(x){
  if(x<=15){
    return(1)
  }
  else{
    return(0)
  }
}

并应用这样的循环。

for(x in c(1:nrow(eco))){eco[x,13]<-check(eco[x,4])}

它继续并继续工作。

我怎样才能缩短这项工作?或者这只是我应该忍受的 R 的极限?

标签: r

解决方案


您可能应该尝试矢量化您的操作(注意:for在 R 中经常可以避免循环)。此外,您可以查看该data.table软件包以进一步提高效率:

library(data.table)

set.seed(1)

## create data.table
eco <- as.data.table(matrix(sample(1:100, 13 * 2598893, replace = TRUE), ncol = 13))

## update column
system.time(
    set(eco, j = 13L, value = 1 * (eco[[4]] <= 15))
)
#>    user  system elapsed 
#>   0.018   0.016   0.033

eco
#>          V1 V2  V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13
#>       1: 68 74  55 62 82 51 42 18 16  12  50  73   0
#>       2: 39 97  53 61 21 25 79 71 85  19  54  30   0
#>       3:  1 89  62 42  5 90 33 77 31   1  59  26   0
#>       4: 34 22  27  4 36 74 65 45 46  67  74  34   1
#>       5: 87 57  88  4 42 26  9 13 64  32  16  15   1
#>      ---                                            
#> 2598889: 91 59  78 28 98 98 13 87 88  46  66  85   0
#> 2598890: 82 60  87 60 49 25 10  9 97  78  61  91   0
#> 2598891: 19  2 100 75 66 88 12 46 94  32  69  56   0
#> 2598892: 18 47  22 87 23 79 56 99 13  29  15  46   0
#> 2598893: 47 30   8  8  9 80 49 78 20  43  86  11   1

推荐阅读