我有一個相當難以矢量化/加速問題的手。我能夠用一個可以縮放的嵌套for循環來解決這個問題。我正在使用的數據是NBA擁有數據,我正在分析它在多個NBA賽季(100K-1M)的行中,這在我的嵌套循環中非常緩慢(多分鐘)。我創建的測試數據突出問題:困難的數據操作來填充R數據框中的值
mydf = data.frame(id1 = c(100, 100, 100, 150, 150, 150),
id2 = c(110, 110, 110, 122, 122, 122),
P1 = c(1, 1, 1, 1, 2, 2),
P2 = c(2, 2, 2, 3, 3, 3),
O1 = c(4, 4, 4, 4, 4, 4),
O2 = c(5, 5, 6, 6, 6, 6),
A1 = 0,
A2 = 0,
A3 = 0,
A4 = 0,
A5 = 0,
A6 = 0)
有6個獨立用戶在該數據幀,(1-6),以及它們的ID出現在P1,P2,O1,O2和列。每個用戶也獲得自己的專欄,(A1-A6)。每當用戶在P1或P2列中出現在一行中時,它的相應列就會得到1.每當用戶出現在列O1或O2中的一行中時,它的相應列就會得到-1。我的for循環解決這個問題如下:
for (i in 1:nrow(mydf)) {
for (j in 3:4) {
tmp = paste0("A",as.character(mydf[i,j]))
mydf[i, which(colnames(mydf) == tmp)] = 1
}
for (j in 5:6) {
tmp = paste0("A",as.character(mydf[i,j]))
mydf[i, which(colnames(mydf) == tmp)] = -1
}
}
我的實際數據幀具有P1-P5,O1-O5,大約300獨特的玩家ID。有關我如何加快速度的任何想法?
謝謝!
注意,我不太確定如果一個玩家ID在多個P/O列中,預期結果如何。第一個版本的最大值爲1,任何負值和正值都會產生0.第二個版本將所有+/- 1加起來。 –
嘿克里斯,感謝這個幫助。它看起來像第一種方法應該有單槓|而不是雙槓||。雙線條返回一個值,而它們應該爲循環的每次迭代返回一個值向量(因爲你的循環用每個循環填充整個列) - 我已經用單條線編輯了上面的代碼來反映這一點。 – Canovice
另外,它看起來像playercols函數更好的出於某種原因,當我添加兩個閉合花括號之間的返回(mydf)。 – Canovice