我试图将数据帧的每一行除以存储在第二个映射数据帧中的数字。
for(g in rownames(data_table)){
print(g)
data_table[g,] <- data_table[g,]/mapping[g,2]
}
然而,这非常慢,每行需要大约1-2秒才能运行。我知道迭代通常不是在R中做事的最佳方式,但我不知道如何做到这一点。有什么方法可以加快运行时间吗?
答案 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]