迭代行的速度更快

时间:2017-07-18 14:38:37

标签: r

我试图将数据帧的每一行除以存储在第二个映射数据帧中的数字。

for(g in rownames(data_table)){
print(g)
data_table[g,] <- data_table[g,]/mapping[g,2]
}

然而,这非常慢,每行需要大约1-2秒才能运行。我知道迭代通常不是在R中做事的最佳方式,但我不知道如何做到这一点。有什么方法可以加快运行时间吗?

2 个答案:

答案 0 :(得分:2)

试试这个:

sweep(data_table, 1, mapping[[2]], "/")

就速度而言,这里是使用iris数据集并包含您的版本的可能性的基准:

microbenchmark::microbenchmark(
 A = {
     for(g in rownames(test)){
         # print(g)
           test[g,] <- test[g,]/test[g,2]
         }
   },
 B = sweep(test, 1, test[[2]], "/"),

 C = test / test[[2]],

 times = 100 
)

#Unit: microseconds
#expr       min        lq        mean    median         uq        max neval
#A 82374.693 83722.023 101688.1254 84582.052 147280.057 157507.892   100
#B   453.652   484.393    514.4094   513.850    539.480    623.688   100
#C   404.506   423.794    456.0063   446.101    470.675    729.205   100

答案 1 :(得分:1)

如果两个变量具有相同的行数,则可以对此操作进行矢量化:

dt <- data.frame(a = rnorm(100), b = rnorm(100))
mapping <- data.frame(x = rnorm(100), y = rnorm(100))

dt / mapping[,2]