рд▓рдЧрднрдЧ data.table

рдпрд╣ рдиреЛрдЯ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдЬреЛ R - data.table рдХреЗ рд▓рд┐рдП рдЯреЗрдмрд▓ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░, рд╢рд╛рдпрдж, рд╡рд┐рднрд┐рдиреНрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рдЪреАрд▓реЗрдкрди рдХреЛ рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдПрдХ рд╕рд╣рдХрд░реНрдореА рдХреЗ рдПрдХ рдЕрдЪреНрдЫреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░ , рдФрд░ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрд╕рдХрд╛ рд▓реЗрдЦ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рдЯреЗрдмрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдб рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЦреБрджрд╛рдИ рдХрд░реЗрдВ ред

рдкрд░рд┐рдЪрдп: data.table рдХрд╣рд╛рдБ рд╕реЗ рдЖрддрд╛ рд╣реИ?


рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рд╕реЗ, рдЬрд╣рд╛рдВ рд╕реЗ рдбреЗрдЯрд╛рдЯреЗрдмрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ (рдЗрд╕рдХреЗ рдмрд╛рдж, рдбреАрдЯреА) рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рд░рдгреА


рдХреЛрдб
## arrays ---------

arrmatr <- array(1:20, c(4,5))

class(arrmatr)

typeof(arrmatr)

is.array(arrmatr)

is.matrix(arrmatr)



рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдПрдХ рд╕рд░рдгреА ( ? рдмреЗрд╕ :: рд╕рд░рдгреА ) рд╣реИред рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреА рддрд░рд╣, рдпрд╣рд╛рдБ рд╕рд░рдгрд┐рдпрд╛рдБ рдмрд╣реБрдЖрдпрд╛рдореА рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╡рд░реНрдЧ ((? рдмреЗрд╕ :: рдореИрдЯреНрд░рд┐рдХреНрд╕ ) рд╕реЗ рдЧреБрдгреЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рджреЛ-рдЖрдпрд╛рдореА рд╕рд░рдгреА рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ , рдФрд░ рдПрдХ-рдЖрдпрд╛рдореА рд╕рд░рдгреА, рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреА рд╣реИ, рд╡реЗрдХреНрдЯрд░ ( ? рдмреЗрд╕ :: рд╡реЗрдХреНрдЯрд░ ) рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ ред

рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рдирд┐рд╣рд┐рдд рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдмреЗрд╕ :: рдЯрд╛рдЗрдкреЛрдлрд╝ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП , рдЬреЛ рдХрд┐ рдЖрд░ рдЗрдВрдЯрд░рдирд▓реНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╡рд░рдг рд▓реМрдЯрд╛рддрд╛ рд╣реИ - рдкрд╣рд▓реЗ-рдЬрдиреНрдореЗ рд╕реА рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд╖рд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ ред

рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд░реНрдЧ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдХрдорд╛рдВрдб рдмреЗрд╕ :: рдХреНрд▓рд╛рд╕ рд╣реИ, рд╡реИрдХреНрдЯрд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдкреНрд░рдХрд╛рд░ (рдпрд╣ рдЖрдВрддрд░рд┐рдХ рдирд╛рдо рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ)ред

рд╕реВрдЪреА


рджреНрд╡рд┐-рдЖрдпрд╛рдореА рд╕рд░рдгреА рд╕реЗ, рдпрд╣ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ, рдЖрдк рд╕реВрдЪреА ( ? рдЖрдзрд╛рд░ :: рд╕реВрдЪреА ) рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред

рдХреЛрдб
## lists ------------------

mylist <- as.list(arrmatr)

is.vector(mylist)

is.list(mylist)


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдХрдИ рдЪреАрдЬреЗрдВ рдПрдХ рд╕рд╛рде рд╣реЛрддреА рд╣реИрдВ:

  • рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рджреВрд╕рд░рд╛ рдЖрдпрд╛рдо рдврд╣ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╣рдо рдПрдХ рд╕реВрдЪреА рдФрд░ рдПрдХ рд╡реЗрдХреНрдЯрд░ рджреЛрдиреЛрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред
  • рд╕реВрдЪреА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрди рд╡рд░реНрдЧреЛрдВ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕рд░рдгреА рдХреЗ рд╕реЗрд▓ рд╕реЗ рдПрдХ рдПрдХрд▓ (рд╕реНрдХреЗрд▓рд░) рдореВрд▓реНрдп рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ред

рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╕реВрдЪреА рднреА рдПрдХ рд╡реЗрдХреНрдЯрд░ рд╣реИ, рд╡реИрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдбреЗрдЯрд╛ рдврд╛рдВрдЪрд╛


рдХрд┐рд╕реА рд╕реВрдЪреА, рдореИрдЯреНрд░рд┐рдХреНрд╕ рдпрд╛ рд╡реЗрдХреНрдЯрд░ рд╕реЗ, рдЖрдк рдбреЗрдЯрд╛ рдлрд╝реНрд░реЗрдо ( ? рдмреЗрд╕ :: data.frame ) рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдХреЛрдб
## data.frames ------------

df <- as.data.frame(arrmatr)
df2 <- as.data.frame(mylist)

is.list(df)

df$V6 <- df$V1 + df$V2


рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ: рдбреЗрдЯрд╛ рдлреНрд░реЗрдо рд╕реВрдЪреА рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ! рдбреЗрдЯрд╛ рдлреНрд░реЗрдо рдХреЗ рдХреЙрд▓рдо рд╕реВрдЪреА рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реИрдВред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛ рдЬрдм рд╣рдо рд╕реВрдЪрд┐рдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рд╡рд┐рд╡рд░рдг рд╕рд╛рд░рдгреА


рдЖрдк рдбреЗрдЯрд╛ рдлреНрд░реЗрдо , рд╕реВрдЪреА, рд╡реЗрдХреНрдЯрд░ рдпрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕реЗ рдбреАрдЯреА (( Data.table :: data.table ) рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ (рдЬрдЧрд╣ рдореЗрдВ)ред

рдХреЛрдб
## data.tables -----------------------
library(data.table)

data.table::setDT(df)

is.list(df)

is.data.frame(df)

is.data.table(df)


рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐, рдбреЗрдЯрд╛ рдлреНрд░реЗрдо рдХреА рддрд░рд╣, рдбреАрдЯреА рд╕реВрдЪреА рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред

рдбреАрдЯреА рдФрд░ рдореЗрдореЛрд░реА


рдЖрд░ рдмреЗрд╕ рдореЗрдВ рдЕрдиреНрдп рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдбреАрдЯреА рдХреЛ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдирдП рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЙрдкреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ data.table :: copy рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдЖрдкрдХреЛ рдкреБрд░рд╛рдиреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдХреЛрдб
df2 <- df

df[V1 == 1, V2 := 999]

data.table::fsetdiff(df, df2)

df2 <- data.table::copy(df)

df[V1 == 2, V2 := 999]

data.table::fsetdiff(df, df2)


рдЗрд╕ рдкрд░ рдкрд░рд┐рдЪрдп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдбреАрдЯреА рдЖрд░ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ, рдЬреЛ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдлреНрд░реЗрдо рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдХрд┐рдП рдЧрдП рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рддреНрд╡рд░рдг рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрдиреНрдп рдЖрджрд┐рдо рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИред

Data.table рдЧреБрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг


рдПрдХ рд╕реВрдЪреА рдХреА рддрд░рд╣ ...


рдбреЗрдЯрд╛ рдлрд╝реНрд░реЗрдо рдпрд╛ DT рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдкрд░ рдЗрд░реЗрдЯрд┐рдВрдЧ рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ R рднрд╛рд╖рд╛ рдореЗрдВ рд▓реВрдк рдХреЛрдб C рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдзреАрдорд╛ рд╣реИ , рдФрд░ рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рд╕реНрддрдВрднреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдмрд╣реБрдд рдХрдо рд╣реЛрддреЗ рд╣реИрдВред рд╕реНрддрдВрднреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рдирд╛, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрдВрдн рдПрдХ рд╕реВрдЪреА рдЖрдЗрдЯрдо рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╡реЗрдХреНрдЯрд░ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рд╡реИрдХреНрдЯрд░ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рднрд╛рд╖рд╛ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рджрд┐рд╢ рд╣реИред рдЖрдк рд╕реВрдЪрд┐рдпреЛрдВ рдФрд░ рд╡реИрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрдпрди рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: `[[`, `$` ред

рдХреЛрдб
## operations on data.tables ------------

#using list properties

df$'V1'[1]

df[['V1']]

df[[1]][1]

sapply(df, class)

sapply(df, function(x) sum(is.na(x)))


vectorization


рдпрджрд┐ рдПрдХ рдмрдбрд╝реЗ рдбреАрдЯреА рдХреА рддрд░реНрдЬ рдкрд░ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдбреАрдЯреА рдХреЗ рднреАрддрд░ рдЪрдХреНрд░ рдЕрднреА рднреА рдЖрд░ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдЪрдХреНрд░ рдХрд░рддрд╛ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реА рдкрд░ рдЪрд▓рддрд╛ рд╣реИ ред

рдЖрдЗрдП 100K рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдбрд╝реЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╣рдо рдХреЙрд▓рдо рд╡реЗрдХреНрдЯрд░ w рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рдЕрдХреНрд╖рд░ рдЦреАрдВрдЪреЗрдВрдЧреЗ ред

рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛

рдХреЛрдб
library(magrittr)
library(microbenchmark)

## Bigger example ----

rown <- 100000

dt <- 
	data.table(
		w = sapply(seq_len(rown), function(x) paste(sample(letters, 3, replace = T), collapse = ' '))
		, a = sample(letters, rown, replace = T)
		, b = runif(rown, -3, 3)
		, c = runif(rown, -3, 3)
		, e = rnorm(rown)
	) %>%
	.[, d := 1 + b + c + rnorm(nrow(.))]

# vectorization

microbenchmark({
	dt[
		, first_l := unlist(strsplit(w, split = ' ', fixed = T))[1]
		, by = 1:nrow(dt)
	   ]
})

# second

first_l_f <- function(sd)
{
	strsplit(sd, split = ' ', fixed = T) %>%
		do.call(rbind, .) %>%
		`[`(,1)
}

dt[, first_l := NULL]

microbenchmark({
	dt[
		, first_l := .(first_l_f(w))
		]
})

# third

first_l_f2 <- function(sd)
{
	strsplit(sd, split = ' ', fixed = T) %>%
		unlist %>%
		matrix(nrow = 3) %>%
		`[`(1,)
}

dt[, first_l := NULL]

microbenchmark({
	dt[
		, first_l := .(first_l_f2(w))
		]
})


рдкрд╣рд▓рд╛ рд░рди рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ:

рдЗрдХрд╛рдИ: рдорд┐рд▓реАрд╕реЗрдХрдВрдб
рдПрдХреНрд╕рдкрд╛рдпрд░ рдорд┐рдирдЯ
{dt [, `: = (рдкреНрд░рдердо_рд▓, рдЕрдирд▓рд┐рд╕реНрдЯ (рд╕реНрдЯреНрд░реИрдкреНрд▓рд┐рдЯ (рдбрдмреНрд▓реНрдпреВ, рд╕реНрдкреНрд▓рд┐рдЯ =" ", рдлрд┐рдХреНрд╕реНрдб = рдЯреА)) [1]), рджреНрд╡рд╛рд░рд╛ = 1: nrow (dt)]} 439.6217
lq рдорд╛рдзреНрдп рдордзреНрдпрдпреБрдЧреАрди рдЕрдзрд┐рдХрддрдо рдЕрдзрд┐рдХрддрдо рдЕрдВрддрд░рд╛рд▓
451.9998 460.1593 456.2505 460.9147 621.4042 100

рджреВрд╕рд░рд╛ рд░рди, рдЬрд╣рд╛рдВ рд╕реВрдЪреА рдХреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдмрджрд▓рдХрд░ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ 1 рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдкрд░ рддрддреНрд╡реЛрдВ рдХреЛ рд▓реЗ рдЬрд╛рдХрд░ рд╡реИрд╢реНрд╡реАрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдмрд╛рдж рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реЗрдХреНрдЯрд░рдХрд░рдг рд╣реЛрддрд╛ рд╣реИ) ред рдореИрдВ рдареАрдХ рд╣реЛ рдЬрд╛рдКрдВрдЧрд╛: рд╕реНрдЯреНрд░реИрдкреНрд▓рд┐рдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕реНрддрд░ рдкрд░ рд╡реИрд╢реНрд╡реАрдХрд░рдг , рдЬреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕реВрдЪреА рдХреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдпрдВ рд╡реИрд╢реНрд╡реАрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдард┐рди рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдЧреИрд░-рд╡реЗрдХреНрдЯрд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред

рдЗрдХрд╛рдИ: рдорд┐рд▓реАрд╕реЗрдХрдВрдб
рдПрдХреНрд╕рдкрд░реНрдЯ рдорд┐рдирдЯ lq рдХрд╛ рдорддрд▓рдм рдордзреНрдпрдпреБрдЧреАрди рдЕрдзрд┐рдХрддрдо рдЕрдзрд┐рдХрддрдо
{dt [, `: =` (first_lред (First_l_f (w))))} 93.07916 112.1381 161.97 149 149.6863 185.9893 442.5199 100

рдордВрдЭрд▓рд╛ рддреНрд╡рд░рдг 3 рдЧреБрдирд╛ рд╣реИ ред

рддреАрд╕рд░рд╛ рд░рди, рдЬрд╣рд╛рдВ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдпреЛрдЬрдирд╛ рдмрджрд▓реА рдЬрд╛рддреА рд╣реИред
рдЗрдХрд╛рдИ: рдорд┐рд▓реАрд╕реЗрдХрдВрдб
рдПрдХреНрд╕рдкрд░реНрдЯ рдорд┐рдирдЯ lq рдХрд╛ рдорддрд▓рдм рдордзреНрдпрдпреБрдЧреАрди рдЕрдзрд┐рдХрддрдо рдореИрдХреНрд╕рд╡реЗрд▓
{dt [, `: =` (first_lред (First_l_f2 (w)))]} 32.60481 34.13679 40/4544 35.57115 42.11975 222.972 100

рдордВрдЭрд▓рд╛ рддреНрд╡рд░рдг 13 рдЧреБрдирд╛ рд╣реИ ред

рдЖрдкрдХреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ - рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред

рд╡реИрд╢реНрд╡реАрдХрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг, рдЬрд╣рд╛рдВ рдкрд╛рда рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдХрд░реАрдм рд╣реИ: рд╢рдмреНрджреЛрдВ рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдВрдмрд╛рдИ, рд╡рд┐рднрд┐рдиреНрди рд╢рдмреНрджреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдкрд╣рд▓реЗ 3 рд╢рдмреНрдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕ рддрд░рд╣:



рдпрд╣рд╛рдВ рдкрд┐рдЫрд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡реИрдХреНрдЯрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдВрдмрд╛рдИ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдбрд┐рд▓реАрдЯ рдХрд░рдХреЗ рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВред

рдХреЛрдб
# fourth

rown <- 100000

words <-
	sapply(
		seq_len(rown)
		, function(x){
			nwords <- rbinom(1, 10, 0.5)
			paste(
				sapply(
					seq_len(nwords)
					, function(x){
						paste(sample(letters, rbinom(1, 10, 0.5), replace = T), collapse = '')
					}
				)
				, collapse = ' '
			)
		}
	)

dt <- 
	data.table(
		w = words
		, a = sample(letters, rown, replace = T)
		, b = runif(rown, -3, 3)
		, c = runif(rown, -3, 3)
		, e = rnorm(rown)
	) %>%
	.[, d := 1 + b + c + rnorm(nrow(.))]

first_l_f3 <- function(sd, n)
{
	l <- strsplit(sd, split = ' ', fixed = T)
	
	maxl <- max(lengths(l))
	
	sapply(l, "length<-", maxl) %>%
		`[`(n,) %>%
		as.character
}

microbenchmark({
	dt[
		, (paste0('w_', 1:3)) := lapply(1:3, function(x) first_l_f3(w, x))
		]
})

dt[
	, (paste0('w_', 1:3)) := lapply(1:3, function(x) first_l_f3(w, x))
	]



рдЗрдХрд╛рдИ: рдорд┐рд▓реАрд╕реЗрдХрдВрдб
рдПрдХреНрд╕рдкрд╛рдпрд░ рдорд┐рдирдЯ lq рдХрд╛ рдорддрд▓рдм рд╣реЛрддрд╛ рд╣реИ рдордВрдЭрд▓рд╛
{dt [, `: =тАЩ (((рдкреЗрд╕реНрдЯ_ ("w_", рез: рей)), strsplit (рдбрдмреНрд▓реНрдпреВ, рд╕реНрдкреНрд▓рд┐рдЯ = "", рдлрд┐рдХреНрд╕реНрдб = рдЯреА)]} .7релрез.6ремреирей реп резрем.режрезрез резрежрелрек.рел
реп рейрел.рез репреп рдЙрдХ рдЕрдзрд┐рдХрддрдо рдиреЗрд╡рд▓
резрез78..7рей38 1356.816 100 100


рд╕реНрдХреНрд░рд┐рдкреНрдЯ 1 рд╕реЗрдХрдВрдб рдХреА рдФрд╕рдд рдЧрддрд┐ рд╕реЗ рдЪрд▓реАред рдмреБрд░рд╛ рдирд╣реАрдВред

рдПрдХ рдФрд░, рдЕрдзрд┐рдХ рдХрд┐рдлрд╛рдпрддреА рддрд░реАрдХрд╛kablag:

рдХреЛрдб
# fifth

rown <- 100000

words <-
	sapply(
		seq_len(rown)
		, function(x){
			nwords <- rbinom(1, 10, 0.5)
			paste(
				sapply(
					seq_len(nwords)
					, function(x){
						paste(sample(letters, rbinom(1, 10, 0.5), replace = T), collapse = '')
					}
				)
				, collapse = ' '
			)
		}
	)

dt <- 
	data.table(
		w = words
		, a = sample(letters, rown, replace = T)
		, b = runif(rown, -3, 3)
		, c = runif(rown, -3, 3)
		, e = rnorm(rown)
	) %>%
	.[, d := 1 + b + c + rnorm(nrow(.))]

microbenchmark({
	
	w_split <- dt[
		, data.table::tstrsplit(w, split = ' ', fixed = T, keep = 1L:3L)
		]
	
	dt[
		, `:=` (
			w_1 = as.character(w_split[[1]])
			, w_2 = as.character(w_split[[2]])
			, w_3 = as.character(w_split[[3]])
		)
		]

})



рдореЗрдбрд┐рдпрди 186, 5 рдЧреБрдирд╛ рд╕рд╕реНрддрд╛ ...

рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ рдЬреБрдбрд╝реЗ ...


рдЖрдк рдЪрд╛рдЗрдирд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреАрдЯреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕рд╣реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд╖реНрдардХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рд╣реБрдХ рдХрд░рдиреЗ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЪреАрдиреАред

рдХреЛрдб
# chaining

res1 <- dt[a == 'a'][sample(.N, 100)]

res2 <- dt[, .N, a][, N]

res3 <- dt[, coefficients(lm(e ~ d))[1], a][, .(letter = a, coef = V1)]



рдкрд╛рдЗрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╣ рд░рд╣рд╛ рд╣реИ ...


рд╡рд╣реА рд╕рдВрдЪрд╛рд▓рди рдкрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдореГрджреНрдз рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рддрд░реАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рдбреАрдЯреАред рд╣рдо рдбреАрдЬрд▓ рдИрдВрдзрди рдкрд░ рдХрдИ рдлрд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд▓реЙрдЬрд┐рд╕реНрдЯрд┐рдХ рд░рд┐рдЧреНрд░реЗрд╢рди рдЧреБрдгрд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

рдХреЛрдб
# piping

samplpe_b <- dt[a %in% head(letters), sample(b, 1)]

res4 <- 
	dt %>%
	.[a %in% head(letters)] %>%
	.[, 
	  {
	  	dt0 <- .SD[1:100]
	  	
	  	quants <- 
	  		dt0[, c] %>%
	  		quantile(seq(0.1, 1, 0.1), na.rm = T)
	  	
	  	.(q = quants)
	  }
	  , .(cond = b > samplpe_b)
	  ] %>%
	glm(
		cond ~ q -1
		, family = binomial(link = "logit")
		, data = .
	) %>%
	summary %>%
	.[[12]]


рдбреАрдЯреА рдХреЗ рдЕрдВрджрд░ рд╕рд╛рдВрдЦреНрдпрд┐рдХреА, рдорд╢реАрди рд╕реАрдЦрдиреЗ рдЖрджрд┐


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

рдХреЛрдб
# function

rm(lm_preds)

lm_preds <- function(
	sd, by, n
)
{
	
	if(
		n < 100 | 
		!by[['a']] %in% head(letters, 4)
	   )
	{
		
		res <-
			list(
				low = NA
				, mean = NA
				, high = NA
				, coefs = NA
			)
		
	} else {

		lmm <- 
			lm(
				d ~ c + b
				, data = sd
			)
		
		preds <- 
			stats::predict.lm(
				lmm
				, sd
				, interval = "prediction"
				)
		
		res <-
			list(
				low = preds[, 2]
				, mean = preds[, 1]
				, high = preds[, 3]
				, coefs = coefficients(lmm)
			)
	}

	res
	
}

res5 <- 
	dt %>%
	.[e < 0] %>%
	.[.[, .I[b > 0]]] %>%
	.[, `:=` (
		low = as.numeric(lm_preds(.SD, .BY, .N)[[1]])
		, mean = as.numeric(lm_preds(.SD, .BY, .N)[[2]])
		, high = as.numeric(lm_preds(.SD, .BY, .N)[[3]])
		, coef_c = as.numeric(lm_preds(.SD, .BY, .N)[[4]][1])
		, coef_b = as.numeric(lm_preds(.SD, .BY, .N)[[4]][2])
		, coef_int = as.numeric(lm_preds(.SD, .BY, .N)[[4]][3])
	)
	, a
	] %>%
	.[!is.na(mean), -'e', with = F]


# plot

plo <- 
	res5 %>%
	ggplot +
	facet_wrap(~ a) +
	geom_ribbon(
		aes(
			x = c * coef_c + b * coef_b + coef_int
			, ymin = low
			, ymax = high
			, fill = a
		)
		, size = 0.1
		, alpha = 0.1
	) +
	geom_point(
		aes(
			x = c * coef_c + b * coef_b + coef_int
			, y = mean
			, color = a
		)
		, size = 1
	) +
	geom_point(
		aes(
			x = c * coef_c + b * coef_b + coef_int
			, y = d
		)
		, size = 1
		, color = 'black'
	) +
	theme_minimal()

print(plo)



рдирд┐рд╖реНрдХрд░реНрд╖


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



рдзрдиреНрдпрд╡рд╛рдж!

рдкреВрд░реНрдг рдХреЛрдб


рдХреЛрдб
## load libs ----------------

library(data.table)
library(ggplot2)
library(magrittr)
library(microbenchmark)


## arrays ---------

arrmatr <- array(1:20, c(4,5))

class(arrmatr)

typeof(arrmatr)

is.array(arrmatr)

is.matrix(arrmatr)


## lists ------------------

mylist <- as.list(arrmatr)

is.vector(mylist)

is.list(mylist)


## data.frames ------------

df <- as.data.frame(arrmatr)

is.list(df)

df$V6 <- df$V1 + df$V2


## data.tables -----------------------

data.table::setDT(df)

is.list(df)

is.data.frame(df)

is.data.table(df)

df2 <- df

df[V1 == 1, V2 := 999]

data.table::fsetdiff(df, df2)

df2 <- data.table::copy(df)

df[V1 == 2, V2 := 999]

data.table::fsetdiff(df, df2)


## operations on data.tables ------------

#using list properties

df$'V1'[1]

df[['V1']]

df[[1]][1]

sapply(df, class)

sapply(df, function(x) sum(is.na(x)))


## Bigger example ----

rown <- 100000

dt <- 
	data.table(
		w = sapply(seq_len(rown), function(x) paste(sample(letters, 3, replace = T), collapse = ' '))
		, a = sample(letters, rown, replace = T)
		, b = runif(rown, -3, 3)
		, c = runif(rown, -3, 3)
		, e = rnorm(rown)
	) %>%
	.[, d := 1 + b + c + rnorm(nrow(.))]

# vectorization

# zero - for loop

microbenchmark({
	for(i in 1:nrow(dt))
		{
		dt[
			i
			, first_l := unlist(strsplit(w, split = ' ', fixed = T))[1]
		]
	}
})

# first

microbenchmark({
	dt[
		, first_l := unlist(strsplit(w, split = ' ', fixed = T))[1]
		, by = 1:nrow(dt)
	   ]
})

# second

first_l_f <- function(sd)
{
	strsplit(sd, split = ' ', fixed = T) %>%
		do.call(rbind, .) %>%
		`[`(,1)
}

dt[, first_l := NULL]

microbenchmark({
	dt[
		, first_l := .(first_l_f(w))
		]
})

# third

first_l_f2 <- function(sd)
{
	strsplit(sd, split = ' ', fixed = T) %>%
		unlist %>%
		matrix(nrow = 3) %>%
		`[`(1,)
}

dt[, first_l := NULL]

microbenchmark({
	dt[
		, first_l := .(first_l_f2(w))
		]
})

# fourth

rown <- 100000

words <-
	sapply(
		seq_len(rown)
		, function(x){
			nwords <- rbinom(1, 10, 0.5)
			paste(
				sapply(
					seq_len(nwords)
					, function(x){
						paste(sample(letters, rbinom(1, 10, 0.5), replace = T), collapse = '')
					}
				)
				, collapse = ' '
			)
		}
	)

dt <- 
	data.table(
		w = words
		, a = sample(letters, rown, replace = T)
		, b = runif(rown, -3, 3)
		, c = runif(rown, -3, 3)
		, e = rnorm(rown)
	) %>%
	.[, d := 1 + b + c + rnorm(nrow(.))]

first_l_f3 <- function(sd, n)
{
	l <- strsplit(sd, split = ' ', fixed = T)
	
	maxl <- max(lengths(l))
	
	sapply(l, "length<-", maxl) %>%
		`[`(n,) %>%
		as.character
}

microbenchmark({
	dt[
		, (paste0('w_', 1:3)) := lapply(1:3, function(x) first_l_f3(w, x))
		]
})

dt[
	, (paste0('w_', 1:3)) := lapply(1:3, function(x) first_l_f3(w, x))
	]


# chaining

res1 <- dt[a == 'a'][sample(.N, 100)]

res2 <- dt[, .N, a][, N]

res3 <- dt[, coefficients(lm(e ~ d))[1], a][, .(letter = a, coef = V1)]

# piping

samplpe_b <- dt[a %in% head(letters), sample(b, 1)]

res4 <- 
	dt %>%
	.[a %in% head(letters)] %>%
	.[, 
	  {
	  	dt0 <- .SD[1:100]
	  	
	  	quants <- 
	  		dt0[, c] %>%
	  		quantile(seq(0.1, 1, 0.1), na.rm = T)
	  	
	  	.(q = quants)
	  }
	  , .(cond = b > samplpe_b)
	  ] %>%
	glm(
		cond ~ q -1
		, family = binomial(link = "logit")
		, data = .
	) %>%
	summary %>%
	.[[12]]


# function

rm(lm_preds)

lm_preds <- function(
	sd, by, n
)
{
	
	if(
		n < 100 | 
		!by[['a']] %in% head(letters, 4)
	   )
	{
		
		res <-
			list(
				low = NA
				, mean = NA
				, high = NA
				, coefs = NA
			)
		
	} else {

		lmm <- 
			lm(
				d ~ c + b
				, data = sd
			)
		
		preds <- 
			stats::predict.lm(
				lmm
				, sd
				, interval = "prediction"
				)
		
		res <-
			list(
				low = preds[, 2]
				, mean = preds[, 1]
				, high = preds[, 3]
				, coefs = coefficients(lmm)
			)
	}

	res
	
}

res5 <- 
	dt %>%
	.[e < 0] %>%
	.[.[, .I[b > 0]]] %>%
	.[, `:=` (
		low = as.numeric(lm_preds(.SD, .BY, .N)[[1]])
		, mean = as.numeric(lm_preds(.SD, .BY, .N)[[2]])
		, high = as.numeric(lm_preds(.SD, .BY, .N)[[3]])
		, coef_c = as.numeric(lm_preds(.SD, .BY, .N)[[4]][1])
		, coef_b = as.numeric(lm_preds(.SD, .BY, .N)[[4]][2])
		, coef_int = as.numeric(lm_preds(.SD, .BY, .N)[[4]][3])
	)
	, a
	] %>%
	.[!is.na(mean), -'e', with = F]


# plot

plo <- 
	res5 %>%
	ggplot +
	facet_wrap(~ a) +
	geom_ribbon(
		aes(
			x = c * coef_c + b * coef_b + coef_int
			, ymin = low
			, ymax = high
			, fill = a
		)
		, size = 0.1
		, alpha = 0.1
	) +
	geom_point(
		aes(
			x = c * coef_c + b * coef_b + coef_int
			, y = mean
			, color = a
		)
		, size = 1
	) +
	geom_point(
		aes(
			x = c * coef_c + b * coef_b + coef_int
			, y = d
		)
		, size = 1
		, color = 'black'
	) +
	theme_minimal()

print(plo)


All Articles