2017-07-18 37 views
1

我试图通过存储在第二个映射数据框中的数字来划分数据帧的每一行。快速遍历行的方法

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

但是,这是非常慢,每行需要将近1-2秒才能运行。我知道迭代通常不是在R中做事情的最佳方式,但我不知道如何去做。有什么办法可以加速运行时间吗?

+0

第一,摆脱打印。这使得它更慢 – loki

+0

你可以尝试'应用'或'lapply'。对于你的情况,你可能想使用'mapply',因为你有多个数据帧 – CPak

+3

它们是否有相同的行数?您可以将整列一次划分,只要它们的顺序正确 –

回答

1

试试这个:

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]