Data.table: рд╕рдорд╛рди рдХреЙрд▓рдо рджреНрд╡рд╛рд░рд╛ рд╕рдореБрдЪреНрдЪрдп рдФрд░ рд╕рдореВрд╣рди рдХрд░рддреЗ рд╕рдордп рдЧрд▓рдд рдпреЛрдЧ?

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

рдирдорд╕реНрдХрд╛рд░ред рдЬрдм рдореИрдВ рдПрдХ рд╣реА рдХреЙрд▓рдо рдкрд░ рдПрдХрддреНрд░рд┐рдд рдФрд░ рд╕рдореВрд╣реАрдХрд░рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдбреЗрдЯрд╛ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдореИрдВ рднреНрд░рдорд┐рдд рд╣реВрдВред рдпрд╣ рд╕рдореВрд╣реАрдХреГрдд рдбреЗрдЯрд╛ рдХреЗ рдмрдЬрд╛рдп рд╕рдореВрд╣реАрдХреГрдд рдбреЗрдЯрд╛ рдкрд░ рдХреБрд▓ (рдЬреИрд╕реЗ рдпреЛрдЧ) рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЧрд▓рдд рд╣реИ - рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реИ рдФрд░ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреНрдпрд╛ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдпрд╛ рд╕рдВрднрд╡рддрдГ рдпрджрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ)ред рдореИрдВрдиреЗ dplyr рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдЕрдзрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдореИрдВ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реВрдВ (рдФрд░ SQL рдХреА рддрд░рд╣)ред рдирд╛рдпрдм: рдореИрдВрдиреЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЧрдП рдореБрджреНрджреЛрдВ, рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ, рдЖрджрд┐ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдХреА рдкреНрд░рдХреГрддрд┐ (рдПрдХ рд╣реА рдХреЙрд▓рдо рдХреЛ рд╕рдореВрд╣реАрдХреГрдд рдХрд░рдирд╛ рдФрд░ рдПрдХрддреНрд░ рдХрд░рдирд╛) рдереЛрдбрд╝рд╛ рдЕрдиреВрдард╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рдХреЛрдИ рдореИрдЪ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред

# Minimal reproducible example

рдХреГрдкрдпрд╛ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдХреБрд▓ рдХреЙрд▓рдо рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рддреАрди рдХреЗ рд╕рд╛рде рддреАрди рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдХреБрд▓ 9 рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ, 3 рдирд╣реАрдВред

рдбреЗрдЯрд╛ рддрд╛рд▓рд┐рдХрд╛

library(data.table)
df <- data.frame(SomeNumber=c(1,2,3,1,2,3,1,2,3))
dt <- data.table(df)
r <- dt[, .(.N, Total=sum(SomeNumber)), by=SomeNumber]

рдкрд░рд┐рдгрд╛рдо (рдЖрд░):

   SomeNumber N Total
1:          1 3     1
2:          2 3     2
3:          3 3     3

рджреБрддреНрдХрд╛рд░

library(dplyr)
df <- data.frame(SomeNumber=c(1,2,3,1,2,3,1,2,3))
r <- df %>% group_by(SomeNumber) %>% 
  summarise(N=n(), Total=sum(SomeNumber)) %>%
  ungroup()

рдкрд░рд┐рдгрд╛рдо (рдЖрд░):

   SomeNumber N Total
1:          1 3     3
2:          2 3     6
3:          3 3     9

# Output of sessionInfo()
рдЖрд░ рд╕рдВрд╕реНрдХрд░рдг 3.5.1 (2018-07-02)
рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо: x86_64-w64-mingw32 / x64 (ремрек-рдмрд┐рдЯ)
рдХреЗ рддрд╣рдд рдЪрд▓ рд░рд╣рд╛ рд╣реИ: рд╡рд┐рдВрдбреЛрдЬ> = 8 x64 (9200 рдХрд╛ рдирд┐рд░реНрдорд╛рдг)

рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЙрддреНрдкрд╛рдж: рдбрд┐рдлрд╝реЙрд▓реНрдЯ

рд╕реНрдерд╛рди:
[рез] LC_COLLATE = English_United Kingdom.1252 LC_CTYPE = English_United Kingdom.1252 LC_MONETARY = English_United Kingdom.1252
[рек] LC_NUMERIC = C LC_TIME = рдЕрдВрдЧреНрд░реЗрдЬреА_рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдВрдЧрдбрдо редрезрелреи

рд╕рдВрд▓рдЧреНрди рдЖрдзрд╛рд░ рдкреИрдХреЗрдЬ:
[1] рдЖрдБрдХрдбрд╝реЗ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ grDevices рдмрд░реНрддрди рдбреЗрдЯрд╛ рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ

рдЕрдиреНрдп рд╕рдВрд▓рдЧреНрди рдкреИрдХреЗрдЬ:
[рез] dplyr_0.7.6 data.table_1.11.8 openxlsx_4.1.0 bindrcpp_0.2.2 pivottabler_0.4.0.9000

рдПрдХ рдирд╛рдо рд╕реНрдерд╛рди (рдФрд░ рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЛрдб:
[рез] Rcpp_0.12.19 rstudioapi_0.8 bindr_0.1.1 magrittr_1.5 tidyselect_0.2.4 R6_2.3.0 rlang_0.2.2 fansi_0.0.0 рдЯреВрд▓_3.5.1
10
[рез реп] purrr_0.2.5 htmlwidgets_1.3 рдЧреЛрдВрдж_1.3.0 рдХрдВрдкрд╛рдЗрд▓рд░_3.5.1 рдкрд┐рд▓рд░_1.3.0 jsonlite_1.5 pkgconfig_2.0.2

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

FAQ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░ рдФрд░ рд╕реВрдЪрдХ рдХреЗ рд▓рд┐рдП @ franknarf1 рдФрд░ @jangorecki рдзрдиреНрдпрд╡рд╛рджред
рдПрдлрдПрдХреНрдпреВ рдЙрддреНрддрд░ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЧреНрд░реБрдкрд┐рдВрдЧ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрдиреА рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╕рдорд╛рди рдбреЗрдЯрд╛ рд╡рд╛рд▓реЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрдВрднреЛрдВ рдкрд░ рдПрдХрддреНрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░реБрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рдЕрдм рднреА рдпрд╣ рдЕрдЬреАрдм рдФрд░ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рд╕рд┐рд░реНрдл рдХреБрдЫ рд╣реИ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЖрджрдд рд╣реИред

рдЙрджрд╛рд╣рд░рдг:

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalA=sum(SomeNumberA)), by=SomeNumberA]

рдЙрдкрд░реЛрдХреНрдд рдХрд╛ рдкрд░рд┐рдгрд╛рдо: TotalA = 1

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalB=sum(SomeNumberB)), by=SomeNumberA]

рдЙрдкрд░реЛрдХреНрдд рдХрд╛ рдкрд░рд┐рдгрд╛рдо: TotalB = 3

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalA=sum(SomeNumberA), TotalB=sum(SomeNumberB)), by=SomeNumberA]

рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ, рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ :
Gsum (SomeNumberA) рдореЗрдВ рддреНрд░реБрдЯрд┐: рдСрдмреНрдЬреЗрдХреНрдЯ 'SomeNumberA' рдирд╣реАрдВ рдорд┐рд▓рд╛

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

рдпрд╣ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реИ рдФрд░ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреНрдпрд╛ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдпрд╛ рд╕рдВрднрд╡рддрдГ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ)ред рдореИрдВрдиреЗ dplyr рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдореЗрд░реА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддрд╛ рд╣реИ (рдФрд░ SQL рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ)

j DT[, j, by] , by рдореЗрдВ рдХреЙрд▓рдо 1. рдХреА рд▓рдВрдмрд╛рдИ рд╣реИред рдЖрдк .N*SomeNumber рдХреА рддрд░рд╣ рдЙрд╕ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐:

dt[, .(.N, Total=.N*SomeNumber), by=SomeNumber]
# or, for efficiency with GForce...
dt[, .(.N), by=SomeNumber][, Total := N*SomeNumber][]

рдПрдХ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╢реНрди рджреЗрдЦреЗрдВ "рдкреНрд░рддреНрдпреЗрдХ рд╕рдореВрд╣ рдХреЗ рдЕрдВрджрд░, рд╕рдореВрд╣ рдЪрд░ рд▓рдВрдмрд╛рдИ -1 рдХреНрдпреЛрдВ рд╣реИрдВ?" FAQ рдХреЗ рдЕрдВрджрд░ vignette("datatable-faq") рдпрд╛ https://github.com/Rdatatable/data.table/wiki/Getting-started

FAQ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░ рдФрд░ рд╕реВрдЪрдХ рдХреЗ рд▓рд┐рдП @ franknarf1 рдФрд░ @jangorecki рдзрдиреНрдпрд╡рд╛рджред
рдПрдлрдПрдХреНрдпреВ рдЙрддреНрддрд░ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЧреНрд░реБрдкрд┐рдВрдЧ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрдиреА рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╕рдорд╛рди рдбреЗрдЯрд╛ рд╡рд╛рд▓реЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрдВрднреЛрдВ рдкрд░ рдПрдХрддреНрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░реБрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рдЕрдм рднреА рдпрд╣ рдЕрдЬреАрдм рдФрд░ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рд╕рд┐рд░реНрдл рдХреБрдЫ рд╣реИ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЖрджрдд рд╣реИред

рдЙрджрд╛рд╣рд░рдг:

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalA=sum(SomeNumberA)), by=SomeNumberA]

рдЙрдкрд░реЛрдХреНрдд рдХрд╛ рдкрд░рд┐рдгрд╛рдо: TotalA = 1

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalB=sum(SomeNumberB)), by=SomeNumberA]

рдЙрдкрд░реЛрдХреНрдд рдХрд╛ рдкрд░рд┐рдгрд╛рдо: TotalB = 3

library(data.table)
df <- data.frame(SomeNumberA=c(1,1,1),SomeNumberB=c(1,1,1))
dt <- data.table(df)
r <- dt[, .(.N, TotalA=sum(SomeNumberA), TotalB=sum(SomeNumberB)), by=SomeNumberA]

рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ, рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ :
Gsum (SomeNumberA) рдореЗрдВ рддреНрд░реБрдЯрд┐: рдСрдмреНрдЬреЗрдХреНрдЯ 'SomeNumberA' рдирд╣реАрдВ рдорд┐рд▓рд╛

рдкрд┐рдЫрд▓реЗ рдПрдХ рдмрдЧ рд╣реИ ...

рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ data.table рдХреЗ рд╕рдореВрд╣реАрдХрд░рдг / рдПрдХрддреНрд░реАрдХрд░рдг рд╡рд┐рдзрд┐ рдХреА рдПрдХ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдПрдХрд▓ рдЪрд░ data.table рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣реАрдХрд░рдг рдФрд░ рд╕рдореБрдЪреНрдЪрдп рд╕рдореВрд╣рдмрджреНрдзрддрд╛ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЕрд░реНрдерд╛рдд рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЧрд┐рдирддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдХрддреНрд░реАрдХрд░рдг рдХреЗ рдмрд╛рдж рдпрд╣ рд╕реНрд╡рдпрдВ рдХрд╛ рд╕рдореВрд╣ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рдореВрд▓ 9 рдХреЗ рдмрдЬрд╛рдп рдХреЗрд╡рд▓ 3 SomeNumber рдЪрд░ рдХреЗ рд╕рд╛рде рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдореВрд╣рди рдХреЙрд▓ рдХреЗ рднреАрддрд░ рдХрд╛рд░рдХ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рддреНрд╡рд░рд┐рдд рдФрд░ рдЖрд╕рд╛рди рддрдп рд╣реИред

library(data.table)

df <- data.frame(SomeNumber=c(1, 2, 3, 1, 2, 3, 1, 2, 3))

dt <- data.table(df)

r <- dt[, .(.N, Total = sum(SomeNumber)), by = as.factor(SomeNumber)]

   as.factor N Total
1:         1 3     3
2:         2 3     6
3:         3 3     9
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

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

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

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

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

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

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