考慮這個例子的數據集(下一次,請提供示例數據集中自己)
set.seed(123)
DT <- data.table(x = rnorm(10), y = rnorm(10), z = rnorm(10))
我會嘗試通過行操作,避免使用rowSums
vecotrize,像下面
DT[, names(DT) := {temp = rowSums(.SD) ; (.SD/temp) * (temp > 0)}]
DT
# x y z
# 1: 0.0000000 0.0000000 0.0000000
# 2: 0.0000000 0.0000000 0.0000000
# 3: 1.6697906 0.4293327 -1.0991233
# 4: 0.0000000 0.0000000 0.0000000
# 5: 0.0000000 0.0000000 0.0000000
# 6: 0.9447911 0.9843707 -0.9291618
# 7: 0.2565558 0.2771142 0.4663301
# 8: 0.0000000 0.0000000 0.0000000
# 9: 0.0000000 0.0000000 0.0000000
# 10: -1.3289000 -1.4097961 3.7386962
我創建temp
的原因是爲了避免兩次運行rowSums(.SD)
。 *(temp > 0)
部分基本上是您的if
和else
聲明。它返回的TRUE/FALSE
邏輯載體,然後轉化爲1/0
然後乘以針對(.SD/temp)
另一個解讀是:「在這裏使用data.table而不是矩陣會帶來巨大的性能提升」(而不是認爲「apply」會帶來它)。下面最好的答案是'rowSums',它仍然會將它強制轉換爲矩陣。 – Frank
@Frank公平點。我試圖在一大組非常大的矩陣上做這件事,並且將fread()用於data.table比其他任何事情都快得多,所以我希望我可以留在data.table'域'中這很快。你是說我可能只是轉換爲矩陣並運行上面的'apply'命令,因爲沒有更快的方法來實現這一點? – Stan
是的,我想你可能會轉換爲矩陣,並且使用'rowSums'和其他函數(無論出於何種原因)比相應的'apply'方法更快。我可以想象'rowMeans'和'col'的相同,但也有其他的。如果他們不同意我的話,希望別人會加入進來。 – Frank