рдбрд╛рдЯрд╛ рддрд╛рд▓рд┐рдХрд╛ рд╡рд░рд┐рдкрд░рд┐

рдпреЛ рдиреЛрдЯ R рддрд╛рд▓рд┐рдХрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╢реЛрдзрди рдкреБрд╕реНрддрдХрд╛рд▓рдп data.table рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рдЪрд╛рд╕реЛрдХреЛ рд╡рд┐рд╖рдп рд╣реБрдиреЗрдЫ, рд░ рд╡рд┐рднрд┐рдиреНрди рдЙрджрд╛рд╣рд░рдгрд╣рд░реВрдорд╛ рдпрд╕рдХреЛ рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рдЪрд┐рд▓реЛрдкрди рджреЗрдЦреЗрд░ рдЦреБрд╕реА рд╣реБрди рд╕рдХреНрдЫрдиреНред

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

рдкрд░рд┐рдЪрдп: data.table рдХрд╣рд╛рдБрдмрд╛рдЯ рдЖрдЙрдБрдЫ?

рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╕рдБрдЧ рдЕрд▓рд┐ рдЯрд╛рдврд╛рдмрд╛рдЯ рдкрд░рд┐рдЪрд┐рдд рд╣реБрдиреБ рд░рд╛рдореНрд░реЛ рд╣реБрдиреНрдЫ, рдЕрд░реНрдерд╛рддреН, рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рд╣рд░реВрд╕рдБрдЧ рдЬрд╕рдмрд╛рдЯ data.table рд╡рд╕реНрддреБ (рдпрд╕рдкрдЫрд┐, DT) рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

рдПрд░реНрд░реЗ

рдХреЛрдб

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

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

class(arrmatr)

typeof(arrmatr)

is.array(arrmatr)

is.matrix(arrmatr)

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

рдпреЛ рдмреБрдЭреНрдиреБ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдЫ рдХрд┐ рдХреБрдиреИ рдкрдирд┐ рд╡рд╕реНрддреБрдорд╛ рд░рд╣реЗрдХреЛ рдбреЗрдЯрд╛рдХреЛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдХрд╛рд░реНрдпрджреНрд╡рд╛рд░рд╛ рдЬрд╛рдБрдЪ рдЧрд░рд┐рдиреБрдкрд░реНрдЫред рдЖрдзрд╛рд░::рдкреНрд░рдХрд╛рд░рдХреЛ, рдЬрд╕рд▓реЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рдХрд╛рд░рдХреЛ рдЖрдиреНрддрд░рд┐рдХ рд╡рд┐рд╡рд░рдг рдлрд░реНрдХрд╛рдЙрдБрдЫ рдЖрд░ рдЗрдиреНрдЯрд░реНрдирд▓реНрд╕ тАФ рдореВрд▓рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдПрдЙрдЯрд╛ рд╕рд╛рдЭрд╛ рднрд╛рд╖рд╛ рдкреНрд░реЛрдЯреЛрдХрд▓ C.

рд╡рд╕реНрддреБрдХреЛ рд╡рд░реНрдЧ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░реНрди рдЕрд░реНрдХреЛ рдЖрджреЗрд╢, рдЖрдзрд╛рд░::рд╡рд░реНрдЧ, рднреЗрдХреНрдЯрд░рд╣рд░реВрдХреЛ рд╣рдХрдорд╛ рднреЗрдХреНрдЯрд░ рдкреНрд░рдХрд╛рд░ рдлрд░реНрдХрд╛рдЙрдБрдЫ (рдпрд╕рдХреЛ рдЖрдиреНрддрд░рд┐рдХ рдирд╛рдо рднрдиреНрджрд╛ рдлрд░рдХ рдирд╛рдо рдЫ, рддрд░ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдмреБрдЭреНрди рдкрдирд┐ рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ)ред

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

рджреБрдИ-рдЖрдпрд╛рдореА рдПрд░реЗрдмрд╛рдЯ, рдЬрд╕рд▓рд╛рдИ рдореНрдпрд╛рдЯреНрд░рд┐рдХреНрд╕ рдкрдирд┐ рднрдирд┐рдиреНрдЫ, рддрдкрд╛рдИрдВ рд╕реВрдЪреАрдорд╛ рдЬрд╛рди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ (?рдЖрдзрд╛рд░::рд╕реВрдЪреА).

рдХреЛрдб

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

mylist <- as.list(arrmatr)

is.vector(mylist)

is.list(mylist)

рдзреЗрд░реИ рдХреБрд░рд╛рд╣рд░реВ рдПрдХреИрдЪреЛрдЯрд┐ рд╣реБрдиреНрдЫрдиреН:

  • рдореНрдпрд╛рдЯреНрд░рд┐рдХреНрд╕рдХреЛ рджреЛрд╕реНрд░реЛ рдЖрдпрд╛рдо рдкрддрди рд╣реБрдиреНрдЫ, рдЕрд░реНрдерд╛рддреН, рд╣рд╛рдореАрд▓реЗ рдПрдХреИ рд╕рдордпрдорд╛ рд╕реВрдЪреА рд░ рднреЗрдХреНрдЯрд░ рджреБрд╡реИ рдкрд╛рдЙрдБрдЫреМрдВред
  • рдпрд╕рд░реА рд╕реВрдЪреА рдпреА рд╡рд░реНрдЧрд╣рд░реВрдмрд╛рдЯ рдкреНрд░рд╛рдкреНрдд рд╣реБрдиреНрдЫред рдпреЛ рдзреНрдпрд╛рдирдорд╛ рд░рд╛рдЦреНрдиреБ рдкрд░реНрдЫ рдХрд┐ рд╕реВрдЪреА рддрддреНрд╡ рдореНрдпрд╛рдЯреНрд░рд┐рдХреНрд╕-рдПрд░реЗрдХреЛ рдХрдХреНрд╖рдмрд╛рдЯ рдПрдХ (рд╕реНрдХреЗрд▓рд░) рдорд╛рдирд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреНрдЫред

рд╕реВрдЪреА рдкрдирд┐ рднреЗрдХреНрдЯрд░ рднрдПрдХреЛрд▓реЗ, рдпрд╕рдорд╛ рдХреЗрд╣реА рднреЗрдХреНрдЯрд░ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

рдбреЗрдЯрд╛рдлреНрд░реЗрдо

рд╕реВрдЪреА, рдореНрдпрд╛рдЯреНрд░рд┐рдХреНрд╕ рд╡рд╛ рднреЗрдХреНрдЯрд░рдмрд╛рдЯ рддрдкрд╛рдИрдВ рдбрд╛рдЯрд╛рдлреНрд░реЗрдордорд╛ рдЬрд╛рди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ (?рдЖрдзрд╛рд░::рдбреЗрдЯрд╛.рдлреНрд░реЗрдо).

рдХреЛрдб

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

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

is.list(df)

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

рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рд░реЛрдЪрдХ рдХреБрд░рд╛ рдХреЗ рд╣реЛ рднрдиреЗ рдбреЗрдЯрд╛рдлреНрд░реЗрдо рд╕реВрдЪреАрдмрд╛рдЯ рдкреНрд░рд╛рдкреНрдд рд╣реБрдиреНрдЫ! рдбреЗрдЯрд╛рдлреНрд░реЗрдордХрд╛ рд╕реНрддрдореНрднрд╣рд░реВ рд╕реВрдЪреАрдХрд╛ рдХрдХреНрд╖рд╣рд░реВ рд╣реБрдиреНред рдпреЛ рдкрдЫрд┐ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд╣реБрдиреЗрдЫ рдЬрдм рд╣рд╛рдореА рд╕реВрдЪреАрд╣рд░реВрдорд╛ рд▓рд╛рдЧреВ рд╣реБрдиреЗ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВред

рдбрд╛рдЯрд╛.рдЯреЗрдмрд▓

DT рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН (?data.table::data.table) рдмрд╛рдЯ рд╣реБрди рд╕рдХреНрдЫ рдбреЗрдЯрд╛рдлреНрд░реЗрдо, рд╕реВрдЪреА, рднреЗрдХреНрдЯрд░ рд╡рд╛ рдореНрдпрд╛рдЯреНрд░рд┐рдХреНрд╕ред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпреЛ рдЬрд╕реНрддреИ (рд╕реНрдерд╛рдирдорд╛)ред

рдХреЛрдб

## data.tables -----------------------
library(data.table)

data.table::setDT(df)

is.list(df)

is.data.frame(df)

is.data.table(df)

рдЙрдкрдпреЛрдЧреА рдХреБрд░рд╛ рдХреЗ рд╣реЛ рднрдиреЗ, рдбрд╛рдЯрд╛рдлреНрд░реЗрдо рдЬрд╕реНрддреИ, DT рд▓реЗ рд╕реВрдЪреАрдХреЛ рдЧреБрдгрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрджрдЫред

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

R рдЖрдзрд╛рд░рдорд╛ рд░рд╣реЗрдХрд╛ рдЕрдиреНрдп рд╕рдмреИ рд╡рд╕реНрддреБрд╣рд░реВ рднрдиреНрджрд╛ рдлрд░рдХ, DT рд╣рд░реВ рд╕рдиреНрджрд░реНрднрджреНрд╡рд╛рд░рд╛ рдкрд╛рд╕ рд╣реБрдиреНрдЫрдиреНред рдпрджрд┐ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдирдпрд╛рдБ рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░рдорд╛ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ, рддрдкрд╛рдИрдВрд▓рд╛рдИ рдкреНрд░рдХрд╛рд░реНрдп рдЪрд╛рд╣рд┐рдиреНрдЫред data.table::рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╡рд╛ рддрдкрд╛рдИрдВрд▓реЗ рдкреБрд░рд╛рдиреЛ рд╡рд╕реНрддреБрдмрд╛рдЯ рдЪрдпрди рдЧрд░реНрдиреБрдкрд░реНрдиреЗрдЫред

рдХреЛрдб

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)

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

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

рднреЗрдХреНрдЯрд░рд╛рдЗрдЬреЗрд╢рди

рдпрджрд┐ рдареВрд▓реЛ DT рдХреЛ рд▓рд╛рдЗрдирд╣рд░реВ рдорд╛рд░реНрдлрдд рдЬрд╛рди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ, рдЙрддреНрддрдо рд╕рдорд╛рдзрд╛рди рднреЗрдХреНрдЯрд░рд╛рдЗрдЬреЗрд╕рдирдХреЛ рд╕рд╛рде рдкреНрд░рдХрд╛рд░реНрдп рд▓реЗрдЦреНрдиреБ рд╣реБрдиреЗрдЫред рддрд░ рдпрджрд┐ рдпрд╕рд▓реЗ рдХрд╛рдо рдЧрд░реНрджреИрди рднрдиреЗ, рддрдкрд╛рдИрдВрд▓реЗ рдпрд╛рдж рдЧрд░реНрдиреБрдкрд░реНрдЫ рдХрд┐ рдЪрдХреНрд░ рднрд┐рддреНрд░ DT рдЕрдЭреИ рдкрдирд┐ рдЪрдХреНрд░ рднрдиреНрджрд╛ рдЫрд┐рдЯреЛ рдЫред R, рдХрд┐рдирдХрд┐ рдпреЛ рдорд╛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░рд┐рдПрдХреЛ рдЫ C.

резрежреж рд╣рдЬрд╛рд░ рдкрдЩреНрдХреНрддрд┐рд╣рд░реВ рднрдПрдХреЛ рдареВрд▓реЛ рдЙрджрд╛рд╣рд░рдгрдорд╛ рдпрд╕рд▓рд╛рдИ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВред рд╣рд╛рдореА рднреЗрдХреНрдЯрд░ рд╕реНрддрдореНрднрдорд╛ рд╕рдорд╛рд╡реЗрд╢ рдЧрд░рд┐рдПрдХрд╛ рд╢рдмреНрджрд╣рд░реВрдмрд╛рдЯ рдкрд╣рд┐рд▓реЛ рдЕрдХреНрд╖рд░ рдирд┐рдХрд╛рд▓реНрдиреЗрдЫреМрдВред 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[, `:=`(first_l, unlist(strsplit(w, split = " ", fixed = T))[1]), by = 1:nrow(dt)] } рекрейреп.ремреирезрен
lq рдФрд╕рдд рдФрд╕рдд uq рдЕрдзрд┐рдХрддрдо рдиреЗрднрд▓
451.9998 460.1593 456.2505 460.9147 621.4042 100

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

рдПрдХрд╛рдЗ: рдорд┐рд▓рд┐рд╕реЗрдХреЗрдиреНрдб
expr min lq рдорддрд▓рдм median uq max neval
{ dt[, `:=`(рдкрд╣рд┐рд▓реЛ_l, .(рдкрд╣рд┐рд▓реЛ_l_f(w)))] } репрей.режренрепрезрем резрезреи.резрейреорез резремрез.репреиремрен 149.6863 185.9893 442.5199 100

рдордзреНрдпрдХрд╛ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рд╡реЗрдЧ in 3 рдкрдЯрдХ.

рддреЗрд╕реНрд░реЛ рд░рди, рдЬрд╣рд╛рдБ рдореНрдпрд╛рдЯреНрд░рд┐рдХреНрд╕ рд░реВрдкрд╛рдиреНрддрд░рдг рдпреЛрдЬрдирд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред

рдПрдХрд╛рдЗ: рдорд┐рд▓рд┐рд╕реЗрдХреЗрдиреНрдб
expr min lq рдорддрд▓рдм median uq max neval
{ dt[, `:=`(рдкрд╣рд┐рд▓реЛ_l, .(рдкрд╣рд┐рд▓реЛ_l_f2(w)))] } рейреи.ремрежрекреорез рейрек.резрейремренреп рекреж.рекрелрекрек 35.57115 42.11975 222.972 100

рдордзреНрдпрдХрд╛ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рд╡реЗрдЧ in 13 рдкрдЯрдХ.

рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рдХреБрд░рд╛рдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрдкрд░реНрдЫ, рдЬрддрд┐ рдзреЗрд░реИ рддреНрдпрддрд┐ рд░рд╛рдореНрд░реЛред

рднреЗрдХреНрдЯрд░рд╛рдЗрдЬреЗрд╕рдирдХреЛ рдЕрд░реНрдХреЛ рдЙрджрд╛рд╣рд░рдг, рдЬрд╣рд╛рдБ рдкрд╛рда рдкрдирд┐ рдЫ, рддрд░ рдпреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрд╡рд╕реНрдерд╛рдХреЛ рдирдЬрд┐рдХ рдЫ: рд╢рдмреНрджрд╣рд░реВрдХреЛ рдлрд░рдХ рд▓рдореНрдмрд╛рдЗ, рд╢рдмреНрджрд╣рд░реВрдХреЛ рдлрд░рдХ рд╕рдВрдЦреНрдпрд╛ред рдкрд╣рд┐рд▓реЛ рей рд╢рдмреНрджрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпрд╕рд░реА:

рдбрд╛рдЯрд╛ рддрд╛рд▓рд┐рдХрд╛ рд╡рд░рд┐рдкрд░рд┐

рдпрд╣рд╛рдБ рдЕрдШрд┐рд▓реНрд▓реЛ рдкреНрд░рдХрд╛рд░реНрдпрд▓реЗ рдХрд╛рдо рдЧрд░реНрджреИрди, рдХрд┐рдирдХрд┐ рднреЗрдХреНрдЯрд░рд╣рд░реВ рдлрд░рдХ рд▓рдореНрдмрд╛рдЗрдХрд╛ рдЫрдиреН, рд░ рд╣рд╛рдореАрд▓реЗ рдореНрдпрд╛рдЯреНрд░рд┐рдХреНрд╕ рд╕рд╛рдЗрдЬ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реЗрдХрд╛ рдЫреМрдВред рдЗрдиреНрдЯрд░рдиреЗрдЯрдорд╛ рд╡рд░рд┐рдкрд░рд┐ рдЦреЛрдЬреЗрд░ рдпрд╕рд▓рд╛рдИ рдкреБрди: рдЧрд░реМрдВред

рдХреЛрдб

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

рдПрдХрд╛рдЗ: рдорд┐рд▓рд┐рд╕реЗрдХреЗрдиреНрдб
expr рдиреНрдпреВрдирддрдо lq рдорд╛рдзреНрдп рдордзреНрдпрдХ

{ dt[, `:=`((paste0(тАЬw_тАЭ, 1:3)), strsplit(w, рд╡рд┐рднрд╛рдЬрди = " ", рд╕реНрдерд┐рд░ = T))] } реорелрез.ренремреирей репрезрем.режренрез резрежрелрек.рел 1035.199
uq рдЕрдзрд┐рдХрддрдо рдиреЗрднрд▓
1178.738 1356.816 100

рд╕реНрдХреНрд░рд┐рдкреНрдЯрд▓реЗ рдФрд╕рдд рез рд╕реЗрдХреЗрдиреНрдбрдХреЛ рдЧрддрд┐рдорд╛ рдХрд╛рдо рдЧрд░реНтАНрдпреЛред рдирд░рд╛рдореНрд░реЛ рд╣реЛрдЗрдиред

рдПрдЙрдЯреИ рдЪреЗрдирджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд┐рдПрдХреЛ...

рддрдкрд╛рдИрдВ рдЪреЗрдирд┐рдЩ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ DT рд╡рд╕реНрддреБрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рдпреЛ рджрд╛рдпрд╛рдБрддрд┐рд░ рдХреЛрд╖реНрдардХ рд╕рд┐рдиреНрдЯреНрдпрд╛рдХреНрд╕ рд╕рдВрд▓рдЧреНрди рдЧрд░реЗрдХреЛ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ, рдореВрд▓ рд░реВрдкрдорд╛ рдЪрд┐рдиреАред

рдХреЛрдб

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

рдпреЛ рдкрд╛рдЗрдкрд╣рд░реВ рдорд╛рд░реНрдлрдд рдмрдЧреНрдЫ...

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

рдХреЛрдб

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

DT рднрд┐рддреНрд░ рддрдереНрдпрд╛рдЩреНрдХ, рдореЗрд╕рд┐рди рд▓рд░реНрдирд┐рдЩ рд░ рдЕрдиреНрдп рдХреБрд░рд╛рд╣рд░реВ

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

рдХреЛрдб

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

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

рдорд▓рд╛рдИ рдЖрд╢рд╛ рдЫ рдХрд┐ рдо data.table рдЬрд╕реНрддреЛ рд╡рд╕реНрддреБрдХреЛ рдкреВрд░реНрдг, рддрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдкрдорд╛ рдкреВрд░реНрдг рдирднрдПрдХреЛ рддрд╕реНрд╡реАрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдХреНрд╖рдо рднрдПрдБ, рдЬреБрди R рд╡рд░реНрдЧрд╣рд░реВрдмрд╛рдЯ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░рд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдпрд╕рдХреЛ рдЧреБрдгрд╣рд░реВрдмрд╛рдЯ рд╕реБрд░реБ рд╣реБрдиреНрдЫ рд░ 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)

рд╕реНрд░реЛрдд: www.habr.com

DDoS рд╕реБрд░рдХреНрд╖рд╛, VPS VDS рд╕рд░реНрднрд░рд╣рд░реВ рднрдПрдХрд╛ рд╕рд╛рдЗрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рднрд░рдкрд░реНрджреЛ рд╣реЛрд╕реНрдЯрд┐рдЩ рдЦрд░рд┐рдж рдЧрд░реНрдиреБрд╣реЛрд╕реН ЁЯФе DDoS рд╕реБрд░рдХреНрд╖рд╛, VPS VDS рд╕рд░реНрднрд░рд╣рд░реВ рд╕рд╣рд┐рддрдХреЛ рднрд░рдкрд░реНрджреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╣реЛрд╕реНрдЯрд┐рдЩ рдХрд┐рдиреНрдиреБрд╣реЛрд╕реН | ProHoster