Data.table: GForce `:=` рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреЛ рдирд┐рд░реНрдорд┐рдд 29 рдЕрдХреНрддреВре░ 2015  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Rdatatable/data.table

GForce enhancement performance

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдмрд╕ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рд╕реЗ рдЬрдЯрд┐рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ GForce рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рдХрд╛рдо рдХреЗ рд╕рд╛рдеред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рдП:

slope <- function(x, y) {
  x_ux <- x - mean(x)
  uy <- mean(y)
  sum(x_ux * (y - uy)) / sum(x_ux ^ 2)
}

рдРрд╕рд╛ рдХрд░рдХреЗ:

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)]

рдЬрдмрдХрд┐ рдЕрдЧрд░ GForce рдХреЛ := рдореЗрдВ рд╕рдорд░реНрдерди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рддреЛ рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рдереЗ:

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)]

рдЬреЛ рд╕рд╛рдл рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рддреЗрдЬ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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]

рдореЗрд░реЗ рд▓рд┐рдП, рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рдореБрд╣рд╛рд╡рд░реЗрджрд╛рд░ рджрд┐рдЦрддрд╛ рд╣реИ, рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЪрд░ рдХреЛ рдЕрдВрдд рдореЗрдВ users рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рджреВрд╕рд░рд╛: https://stackoverflow.com/a/47338118/ (gtail)

рдПрдХ рдФрд░ https://stackoverflow.com/a/51569126/ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ DT[, mx := max(pt), by=Subject][, diff := mx - pt][] рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдПрдХ рдФрд░, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрдореГрддрд┐ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд░реБрдЪрд┐: https://stackoverflow.com/q/52189712 "data.table рд╕рдВрджрд░реНрдн рд╢рдмреНрджрд╛рд░реНрде: рд╕рднреА рд╕реНрддрдВрднреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд╛ рд╕реНрдореГрддрд┐ рдЙрдкрдпреЛрдЧ"

рджреВрд╕рд░рд╛, scale / рдХрдИ рдЪрд░реЛрдВ рдХреЛ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ: https://stackoverflow.com/q/52528123

рдПрдХ рдФрд░ рд╕рдореВрд╣ рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕рдмрд╕реЗрдЯрд┐рдВрдЧ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХрддрдо рд▓реЗрдирд╛ рдФрд░ := рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ (рдЕрдХреНрд░реБрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдЦреЗрдВ) https://stackoverflow.com/a/54911855/ рднреА #971 рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рдкреВрд░реНрдг рднрд╛рдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ

рдмрд╕ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЗрд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рд╕реЗ рдЬрдЯрд┐рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ GForce рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рдХрд╛рдо рдХреЗ рд╕рд╛рдеред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рдП:

slope <- function(x, y) {
  x_ux <- x - mean(x)
  uy <- mean(y)
  sum(x_ux * (y - uy)) / sum(x_ux ^ 2)
}

рдРрд╕рд╛ рдХрд░рдХреЗ:

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)]

рдЬрдмрдХрд┐ рдЕрдЧрд░ GForce рдХреЛ := рдореЗрдВ рд╕рдорд░реНрдерди рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рддреЛ рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рдереЗ:

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)]

рдЬреЛ рд╕рд╛рдл рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рддреЗрдЬ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

@MichaelChirico рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рдХрд░рд╛рдпрд╛ рд╣реИ:

>   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

#523 рд╕реЗ рдХреНрд░реЙрд╕ рд▓рд┐рдВрдХрд┐рдВрдЧред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

alex46015 picture alex46015  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

pannnda picture pannnda  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tcederquist picture tcederquist  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

franknarf1 picture franknarf1  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jangorecki picture jangorecki  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ