Baru saja mengalami ini hari ini melihat pertanyaan di SO :
actions = data.table(User_id = c("Carl","Carl","Carl","Lisa","Moe"),
category = c(1,1,2,2,1),
value= c(10,20,30,40,50))
users = actions[, other_var := 1, by=User_id]
# verbose says: the following is not optimized
users[, value_one := 0 ]
users[actions[category==1], value_one := sum(value), on="User_id", by=.EACHI, verbose=TRUE]
# verbose says: the following is optimized
rbind(
actions[category==1],
unique(actions[,"User_id", with=FALSE])[, value := 0 ],
fill=TRUE)[, sum(value), by=User_id, verbose=TRUE]
Bagi saya, cara pertama terlihat idiomatis, mengingat variabel harus berakhir di users
pada akhirnya.
Lainnya: https://stackoverflow.com/a/47338118/ (gtail)
https://stackoverflow.com/a/51569126/ lain harus melakukan DT[, mx := max(pt), by=Subject][, diff := mx - pt][]
kurasa
Lain, yang secara khusus tertarik pada kinerja memori: https://stackoverflow.com/q/52189712 "semantik referensi data.table: penggunaan memori dari iterasi melalui semua kolom"
Lain, ingin scale
/merendahkan beberapa variabel: https://stackoverflow.com/q/52528123
Lain mengambil maks berdasarkan grup dengan kondisi subsetting dan menambahkan dengan := (lihat jawaban akrun) https://stackoverflow.com/a/54911855/ juga terkait dengan bagian #971 yang sudah selesai
Hanya ingin menekankan bahwa mengaktifkan ini dapat memungkinkan penggunaan GForce secara efektif untuk ekspresi kompleks, meskipun dengan beberapa pekerjaan. Misalnya saya tunjukkan di posting ini cara mengaktifkannya untuk:
slope <- function(x, y) {
x_ux <- x - mean(x)
uy <- mean(y)
sum(x_ux * (y - uy)) / sum(x_ux ^ 2)
}
Dengan melakukan:
DT <- data.table(grp, x, y)
setkey(DT, grp)
DTsum <- DT[, .(ux=mean(x), uy=mean(y)), keyby=grp]
DT[DTsum, `:=`(x_ux=x - ux, y_uy=y - uy)]
DT[, `:=`(x_ux.y_uy=x_ux * y_uy, x_ux2=x_ux^2)]
DTsum <- DT[, .(x_ux.y_uy=sum(x_ux.y_uy), x_ux2=sum(x_ux2)), keyby=grp]
res.slope.dt2 <- DTsum[, .(grp, V1=x_ux.y_uy / x_ux2)]
Sedangkan jika GForce didukung di :=
kita bisa melakukan:
DT <- data.table(grp, x, y)
DT[, `:=`(ux=mean(x), uy=mean(y)), keyby=grp]
DT[, `:=`(x_ux=x - ux, y_uy=y - uy)]
DT[, `:=`(x_ux.y_uy=x_ux * y_uy, x_ux2=x_ux^2)]
DTsum <- DT[, .(x_ux.y_uy=sum(x_ux.y_uy), x_ux2=sum(x_ux2)), keyby=grp]
res.slope.dt3 <- DTsum[, .(grp, x_ux.y_uy/x_ux2)]
Yang terlihat lebih bersih dan harus lebih cepat.
Diskusi dengan @MichaelChirico membuat saya menyadari sepupu yang sangat dekat dengan masalah ini adalah:
> DT <- data.table(x, y, grp)
> DT[, .(x, mean(x)), keyby=grp]
Detected that j uses these columns: x
Finding groups using forderv ... 1.049s elapsed (0.946s cpu)
Finding group sizes from the positions (can be avoided to save RAM) ... 0.011s elapsed (0.011s cpu)
lapply optimization is on, j unchanged as 'list(x, mean(x))'
GForce is on, left j unchanged
Old mean optimization changed j from 'list(x, mean(x))' to 'list(x, .External(Cfastmean, x, FALSE))'
Making each group and running j (GForce FALSE) ...
collecting discontiguous groups took 1.293s for 999953 groups
eval(j) took 1.860s for 999953 calls
5.517s elapsed (3.862s cpu)
grp x V2
1: 1 0.2151365 0.5512966
2: 1 0.5358256 0.5512966
3: 1 0.8496598 0.5512966
4: 1 0.8480730 0.5512966
5: 1 0.3464458 0.5512966
---
9999996: 1000000 0.2601940 0.5474986
9999997: 1000000 0.7940921 0.5474986
9999998: 1000000 0.3825493 0.5474986
9999999: 1000000 0.1786861 0.5474986
10000000: 1000000 0.9179119 0.5474986
Tautan silang ke #523.
Komentar yang paling membantu
Hanya ingin menekankan bahwa mengaktifkan ini dapat memungkinkan penggunaan GForce secara efektif untuk ekspresi kompleks, meskipun dengan beberapa pekerjaan. Misalnya saya tunjukkan di posting ini cara mengaktifkannya untuk:
Dengan melakukan:
Sedangkan jika GForce didukung di
:=
kita bisa melakukan:Yang terlihat lebih bersih dan harus lebih cepat.