ΠΠ²Π°Π° Π±Π΅Π»Π΅ΡΠΊΠ° ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΎΠ΄ ΠΈΠ½ΡΠ΅ΡΠ΅Ρ Π·Π° ΠΎΠ½ΠΈΠ΅ ΠΊΠΎΠΈ ΡΠ° ΠΊΠΎΡΠΈΡΡΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΠΎ ΡΠ°Π±Π΅Π»ΠΈ Π·Π° 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)
ΠΠ΄Π½Π° ΡΠ°ΠΊΠ²Π° ΡΡΡΡΠΊΡΡΡΠ° Π΅ Π½ΠΈΠ·Π° (?ΠΎΡΠ½ΠΎΠ²Π°::Π½ΠΈΠ·Π°). ΠΠ°ΠΊΠΎ ΠΈ ΠΊΠ°Ρ Π΄ΡΡΠ³ΠΈΡΠ΅ ΡΠ°Π·ΠΈΡΠΈ, Π½ΠΈΠ·ΠΈΡΠ΅ ΠΎΠ²Π΄Π΅ ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅Π΄ΠΈΠΌΠ΅Π½Π·ΠΈΠΎΠ½Π°Π»Π½ΠΈ. Π‘Π΅ΠΏΠ°ΠΊ, ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΡΠΎ Π΅ ΡΡΠΎ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π²ΠΎΠ΄ΠΈΠΌΠ΅Π½Π·ΠΈΠΎΠ½Π°Π»Π½Π° Π½ΠΈΠ·Π° ΠΏΠΎΡΠ½ΡΠ²Π° Π΄Π° Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π° ΡΠ²ΠΎΡΡΡΠ²Π° ΠΎΠ΄ ΠΊΠ»Π°ΡΠ°ΡΠ° Π½Π° ΠΌΠ°ΡΡΠΈΡΠ°ΡΠ° (?ΠΎΡΠ½ΠΎΠ²Π°::ΠΌΠ°ΡΡΠΈΡΠ°), Π° Π΅Π΄Π½ΠΎΠ΄ΠΈΠΌΠ΅Π½Π·ΠΈΠΎΠ½Π°Π»Π½Π°ΡΠ° Π½ΠΈΠ·Π°, ΠΊΠΎΡΠ° Π΅ ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° Π²Π°ΠΆΠ½Π°, Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π° ΠΎΠ΄ Π²Π΅ΠΊΡΠΎΡ (?ΠΎΡΠ½ΠΎΠ²Π°::Π²Π΅ΠΊΡΠΎΡ).
Π’ΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ Π΄Π΅ΠΊΠ° ΡΠΈΠΏΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΠΎΠ΄ΡΠΆΠ°Π½ΠΈ Π²ΠΎ ΠΊΠΎΡ Π±ΠΈΠ»ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΠ°ΡΠ° ΠΎΡΠ½ΠΎΠ²Π°::ΡΠΈΠΏ, ΠΊΠΎΡ Π³ΠΎ Π²ΡΠ°ΡΠ° ΠΎΠΏΠΈΡΠΎΡ Π½Π° Π²Π½Π°ΡΡΠ΅ΡΠ½ΠΈΠΎΡ ΡΠΈΠΏ ΡΠΏΠΎΡΠ΅Π΄ R ΠΠ½Π°ΡΡΠ΅ΡΠ½ΠΈ ΡΠ°Π±ΠΎΡΠΈ - ΠΎΠΏΡΡΠΈΠΎΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π½Π° ΡΠ°Π·ΠΈΠΊΠΎΡ ΠΏΠΎΠ²ΡΠ·Π°Π½ ΡΠΎ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΠΎΡ 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.tables -----------------------
library(data.table)
data.table::setDT(df)
is.list(df)
is.data.frame(df)
is.data.table(df)
ΠΠΎΡΠΈΡΠ½ΠΎ Π΅, ΠΊΠ°ΠΊΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠ½Π° ΡΠ°ΠΌΠΊΠ°, DT Π΄Π° Π³ΠΈ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π° ΡΠ²ΠΎΡΡΡΠ²Π°ΡΠ° Π½Π° ΡΠΏΠΈΡΠΎΠΊΠΎΡ.
ΠΠ’ ΠΈ ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°
ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΠ΄ ΡΠΈΡΠ΅ Π΄ΡΡΠ³ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΈ Π²ΠΎ R Π±Π°Π·Π°ΡΠ°, DT ΡΠ΅ ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π°Π°Ρ ΡΠΎ ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠ°. ΠΠΊΠΎ ΡΡΠ΅Π±Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΊΠΎΠΏΠΈΡΠ° Π²ΠΎ Π½ΠΎΠ²Π° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠΊΠ° ΠΎΠ±Π»Π°ΡΡ, ΠΏΠΎΡΡΠ΅Π±Π½Π° Π²ΠΈ Π΅ ΡΡΠ½ΠΊΡΠΈΡΠ° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.ΡΠ°Π±Π΅Π»Π°::ΠΊΠΎΠΏΠΈΡΠ° ΠΈΠ»ΠΈ ΡΡΠ΅Π±Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΈΠ·Π±ΠΎΡ ΠΎΠ΄ ΡΡΠ°ΡΠΈΠΎΡ ΠΎΠ±ΡΠ΅ΠΊΡ.
ΠΠΎΠ΄
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, ΡΡΠΎ Π³Π»Π°Π²Π½ΠΎ ΡΠ΅ ΡΠ°Π²ΡΠ²Π° ΠΏΠΎΡΠ°Π΄ΠΈ ΠΏΡΠΎΡΠΈΡΡΠ²Π°ΡΠ΅ΡΠΎ ΠΈ Π·Π°Π±ΡΠ·ΡΠ²Π°ΡΠ΅ΡΠΎ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈΡΠ΅ ΠΈΠ·Π²ΡΡΠ΅Π½ΠΈ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡΠΈ ΠΎΠ΄ ΠΊΠ»Π°ΡΠ°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠ½Π° ΡΠ°ΠΌΠΊΠ°. ΠΠΎ ΠΈΡΡΠΎ Π²ΡΠ΅ΠΌΠ΅, Π½Π°ΡΠ»Π΅Π΄ΡΡΠ²ΠΎΡΠΎ ΠΎΠ΄ Π΄ΡΡΠ³ΠΈΡΠ΅ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΡΠΈ Π΅ Π·Π°ΡΡΠ²Π°Π½ΠΎ.
ΠΠ΅ΠΊΠΎΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΡΠ²ΠΎΡΡΡΠ²Π°ΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.ΡΠ°Π±Π΅Π»Π°
ΠΠ°ΠΊΠΎ ΡΠΏΠΈΡΠΎΠΊ...
ΠΠΎΠ²ΡΠΎΡΡΠ²Π°ΡΠ΅ΡΠΎ ΠΏΡΠ΅ΠΊΡ ΡΠ΅Π΄ΠΎΠ²ΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠ½Π°ΡΠ° ΡΠ°ΠΌΠΊΠ° ΠΈΠ»ΠΈ 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)))
ΠΠ΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ°
ΠΠΊΠΎ ΠΈΠΌΠ° ΠΏΠΎΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠΌΠΈΠ½Π΅ Π½ΠΈΠ· Π»ΠΈΠ½ΠΈΠΈΡΠ΅ Π½Π° Π³ΠΎΠ»Π΅ΠΌ ΠΠ’, Π½Π°ΡΠ΄ΠΎΠ±ΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π±ΠΈ Π±ΠΈΠ»ΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΏΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡΠ° ΡΠΎ Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ°. ΠΠΎ, Π°ΠΊΠΎ ΠΎΠ²Π° Π½Π΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ°, ΡΠΎΠ³Π°Ρ ΡΡΠ΅Π±Π° Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΠ΅ Π΄Π΅ΠΊΠ° ΡΠΈΠΊΠ»ΡΡΠΎΡ Π²Π½Π°ΡΡΠ΅ ΠΠ’ Π΅ ΡΠ΅ΠΏΠ°ΠΊ ΠΏΠΎΠ±ΡΠ· ΠΎΠ΄ ΡΠΈΠΊΠ»ΡΡΠΎΡ R, Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠ΅ ΠΈΠ·Π²Π΅Π΄ΡΠ²Π° Π½Π° C.
ΠΡΠ΄Π΅ Π΄Π° Π³ΠΎ ΠΏΡΠΎΠ±Π°ΠΌΠ΅ Π½Π° ΠΏΠΎΠ³ΠΎΠ»Π΅ΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΎ 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[, `:=`(first_l, unlist(strsplit(w, split = " ", fixed = T))[1]), by = 1:nrow(dt)] } 439.6217
lq ΡΡΠ΅Π΄Π½Π° ΡΡΠ΅Π΄Π½Π° Π²ΡΠ΅Π΄Π½ΠΎΡΡ Uq max Π½Π΅Π²Π°Π»
451.9998 460.1593 456.2505 460.9147 621.4042 100
ΠΡΠΎΡΠ°ΡΠ° ΡΠ΅ΡΠΈΡΠ°, ΠΊΠ°Π΄Π΅ ΡΡΠΎ Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΡΠ»ΡΡΡΠ²Π° ΡΠΎ ΠΏΡΠ΅ΡΠ²ΠΎΡΠ°ΡΠ΅ Π½Π° Π»ΠΈΡΡΠ°ΡΠ° Π²ΠΎ ΠΌΠ°ΡΡΠΈΡΠ° ΠΈ ΠΏΡΠ΅Π·Π΅ΠΌΠ°ΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ Π½Π° ΠΏΠ°ΡΡΠ΅ΡΠΎ ΡΠΎ ΠΈΠ½Π΄Π΅ΠΊΡ 1 (Π²ΡΠΎΡΠΎΡΠΎ Π΅ ΡΠ°ΠΌΠ°ΡΠ° Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ°). ΠΠΎΡΠ΅ΠΊΡΠΈΡΠ°: Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° Π½ΠΈΠ²ΠΎ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΠ° strsplit, ΠΊΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΈΡΠ°ΡΠΈ Π²Π΅ΠΊΡΠΎΡ ΠΊΠ°ΠΊΠΎ Π²Π»Π΅Π·. ΠΠ·Π»Π΅Π³ΡΠ²Π° Π΄Π΅ΠΊΠ° ΠΏΠΎΡΡΠ°ΠΏΠΊΠ°ΡΠ° Π·Π° ΠΏΡΠ΅ΡΠ²ΠΎΡΠ°ΡΠ΅ Π½Π° ΡΠΏΠΈΡΠΎΠΊ Π²ΠΎ ΠΌΠ°ΡΡΠΈΡΠ° Π΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΡΠ΅ΡΠΊΠ° ΠΎΠ΄ ΡΠ°ΠΌΠ°ΡΠ° Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ°, Π½ΠΎ Π²ΠΎ ΠΎΠ²ΠΎΡ ΡΠ»ΡΡΠ°Ρ Π΅ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠ±ΡΠ·Π° ΠΎΠ΄ Π½Π΅Π²Π΅ΠΊΡΠΎΡΠΈΠ·ΠΈΡΠ°Π½Π°ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ°.
ΠΠ΄ΠΈΠ½ΠΈΡΠ°: ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ
expr min lq ΡΡΠ΅Π΄Π½Π° ΡΡΠ΅Π΄Π½Π° Π²ΡΠ΅Π΄Π½ΠΎΡΡ Uq max neval
{ dt[, `:=`(first_l, .(first_l_f(w)))] } 93.07916 112.1381 161.9267 149.6863 185.9893 442.5199 100
ΠΠ°Π±ΡΠ·ΡΠ²Π°ΡΠ΅ ΡΠΎ ΠΌΠ΅Π΄ΠΈΡΠ°Π½Π° Π²ΠΎ 3 ΠΏΠ°ΡΠΈ.
Π’ΡΠ΅ΡΠΎΡΠΎ Π²ΠΎΠ·Π΅ΡΠ΅, ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡΠ° Π²ΠΎ ΠΌΠ°ΡΡΠΈΡΠ°ΡΠ° Π±Π΅ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π΅ΡΠ°.
ΠΠ΄ΠΈΠ½ΠΈΡΠ°: ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ
expr min lq ΡΡΠ΅Π΄Π½Π° ΡΡΠ΅Π΄Π½Π° Π²ΡΠ΅Π΄Π½ΠΎΡΡ Uq max neval
{ 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))
]
ΠΠ΄ΠΈΠ½ΠΈΡΠ°: ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ
expr min lq ΡΡΠ΅Π΄Π½Π° ΡΡΠ΅Π΄ΠΈΠ½Π°
{ dt[, `:=`((paste0(βw_β, 1:3)), strsplit(w, split = " ", ΡΠΈΠΊΡΠ½Π° = T))] } 851.7623 916.071 1054.5 1035.199
uq max neval
1178.738 1356.816 100
Π‘ΡΠ΅Π½Π°ΡΠΈΠΎΡΠΎ ΡΠ΅ ΠΎΠ΄Π²ΠΈΠ²Π°ΡΠ΅ ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΠ½Π° Π±ΡΠ·ΠΈΠ½Π° ΠΎΠ΄ 1 ΡΠ΅ΠΊΡΠ½Π΄Π°. ΠΠ΅ Π΅ Π»ΠΎΡΠΎ.
ΠΠΎΠ²ΡΠ·Π°Π½ΠΈ ΡΠΎ Π΅Π΄Π΅Π½ ΡΠΈΠ½ΡΠΈΡ...
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΡΠΎ 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 ΠΈ Π·Π°Π²ΡΡΡΠ²Π°ΡΡΠΈ ΡΠΎ Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΡΠΎΠΏΡΡΠ²Π΅Π½ΠΈ ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ ΠΈ ΠΎΠΊΠΎΠ»ΠΈΠ½Π° ΠΎΠ΄ ΡΡΠ΅Π΄Π½ΠΈ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ . Π‘Π΅ Π½Π°Π΄Π΅Π²Π°ΠΌ Π΄Π΅ΠΊΠ° ΠΎΠ²Π° ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΠΎ Π΄Π° Π½Π°ΡΡΠΈΡΠ΅ ΠΈ Π΄Π° ΡΠ° ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΎΠ²Π°Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π·Π° ΡΠ°Π±ΠΎΡΠ° ΠΈ Π·Π°Π±Π°Π²Π°.

ΠΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠΈΠΌΠ΅!
Π¦Π΅Π»ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄
ΠΠΎΠ΄
## 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
