рдирдорд╕реНрдХрд╛рд░ред рдЬрдм рдореИрдВ рдПрдХ рд╣реА рдХреЙрд▓рдо рдкрд░ рдПрдХрддреНрд░рд┐рдд рдФрд░ рд╕рдореВрд╣реАрдХрд░рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ рдбреЗрдЯрд╛ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдореИрдВ рднреНрд░рдорд┐рдд рд╣реВрдВред рдпрд╣ рд╕рдореВрд╣реАрдХреГрдд рдбреЗрдЯрд╛ рдХреЗ рдмрдЬрд╛рдп рд╕рдореВрд╣реАрдХреГрдд рдбреЗрдЯрд╛ рдкрд░ рдХреБрд▓ (рдЬреИрд╕реЗ рдпреЛрдЧ) рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд╣ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЧрд▓рдд рд╣реИ - рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реИ рдФрд░ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреНрдпрд╛ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдпрд╛ рд╕рдВрднрд╡рддрдГ рдпрджрд┐ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ)ред рдореИрдВрдиреЗ 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
рдпрд╣ рдЕрдиреНрдп рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реИ рдФрд░ рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреНрдпрд╛ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ (рдпрд╛ рд╕рдВрднрд╡рддрдГ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ)ред рдореИрдВрдиреЗ 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
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
FAQ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░ рдФрд░ рд╕реВрдЪрдХ рдХреЗ рд▓рд┐рдП @ franknarf1 рдФрд░ @jangorecki рдзрдиреНрдпрд╡рд╛рджред
рдПрдлрдПрдХреНрдпреВ рдЙрддреНрддрд░ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЧреНрд░реБрдкрд┐рдВрдЧ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрдиреА рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╕рдорд╛рди рдбреЗрдЯрд╛ рд╡рд╛рд▓реЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрдВрднреЛрдВ рдкрд░ рдПрдХрддреНрд░ рдХрд░рдиреЗ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░реБрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЭреЗ рдЕрдм рднреА рдпрд╣ рдЕрдЬреАрдм рдФрд░ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдпрд╣ рд╕рд┐рд░реНрдл рдХреБрдЫ рд╣реИ рдЬрд┐рд╕рдХреА рдореБрдЭреЗ рдЖрджрдд рд╣реИред
рдЙрджрд╛рд╣рд░рдг:
рдЙрдкрд░реЛрдХреНрдд рдХрд╛ рдкрд░рд┐рдгрд╛рдо: TotalA = 1
рдЙрдкрд░реЛрдХреНрдд рдХрд╛ рдкрд░рд┐рдгрд╛рдо: TotalB = 3
рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ, рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ :
Gsum (SomeNumberA) рдореЗрдВ рддреНрд░реБрдЯрд┐: рдСрдмреНрдЬреЗрдХреНрдЯ 'SomeNumberA' рдирд╣реАрдВ рдорд┐рд▓рд╛