我試圖通過存儲在第二個映射數據框中的數字來劃分數據幀的每一行。快速遍歷行的方法
for(g in rownames(data_table)){
print(g)
data_table[g,] <- data_table[g,]/mapping[g,2]
}
但是,這是非常慢,每行需要將近1-2秒才能運行。我知道迭代通常不是在R中做事情的最佳方式,但我不知道如何去做。有什麼辦法可以加速運行時間嗎?
我試圖通過存儲在第二個映射數據框中的數字來劃分數據幀的每一行。快速遍歷行的方法
for(g in rownames(data_table)){
print(g)
data_table[g,] <- data_table[g,]/mapping[g,2]
}
但是,這是非常慢,每行需要將近1-2秒才能運行。我知道迭代通常不是在R中做事情的最佳方式,但我不知道如何去做。有什麼辦法可以加速運行時間嗎?
試試這個:
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
「虹膜」數據集對於有意義的性能基準太小 –
如果兩個變量,你可以向量化該操作相同行數:
dt <- data.frame(a = rnorm(100), b = rnorm(100))
mapping <- data.frame(x = rnorm(100), y = rnorm(100))
dt/mapping[,2]
第一,擺脫打印。這使得它更慢 – loki
你可以嘗試'應用'或'lapply'。對於你的情況,你可能想使用'mapply',因爲你有多個數據幀 – CPak
它們是否有相同的行數?您可以將整列一次劃分,只要它們的順序正確 –