Π’Π°Π·ΠΈ Π±Π΅Π»Π΅ΠΆΠΊΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° Π·Π° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠ°Π±Π»ΠΈΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ Π·Π° R β data.table, ΠΈ Π²Π΅ΡΠΎΡΡΠ½ΠΎ ΡΠ΅ ΡΠ΅ Π·Π°ΡΠ°Π΄Π²Π°Ρ Π΄Π° Π²ΠΈΠ΄ΡΡ Π³ΡΠ²ΠΊΠ°Π²ΠΎΡΡΡΠ° Π½Π° Π½Π΅ΠΉΠ½ΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ.
ΠΠ΄ΡΡ
Π½ΠΎΠ²Π΅Π½ΠΈ ΠΎΡ Π΄ΠΎΠ±ΡΡ ΠΏΡΠΈΠΌΠ΅Ρ , ΠΈ Π½Π°Π΄ΡΠ²Π°ΠΉΠΊΠΈ ΡΠ΅, ΡΠ΅ Π²Π΅ΡΠ΅ ΡΡΠ΅ ΠΏΡΠΎΡΠ΅Π»ΠΈ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΡΠ°ΡΠΈΡ, ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΠΌ Π΄Π° ΡΠ΅ Π·Π°Π΄ΡΠ»Π±ΠΎΡΠΈΠΌ Π² ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° ΠΊΠΎΠ΄Π° ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π°ΡΠ° Π½Π° data.table.
ΠΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅: ΠΎΡΠΊΡΠ΄Π΅ ΠΈΠ΄Π²Π° data.table?
ΠΠ°ΠΉ-Π΄ΠΎΠ±ΡΠ΅ Π΅ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π²Π°Π½Π΅ΡΠΎ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΠΎΡΠ΄Π°Π»Π΅Ρ, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, ΠΎΡ ΡΡΡΡΠΊΡΡΡΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ ΠΎΠ±Π΅ΠΊΡΡΡ data.table (ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΠΊ, ΠΠ’).
ΠΠ°ΡΠΈΠ²
ΠΠΎΠ΄
## arrays ---------
arrmatr <- array(1:20, c(4,5))
class(arrmatr)
typeof(arrmatr)
is.array(arrmatr)
is.matrix(arrmatr)
ΠΠ΄Π½Π° ΠΎΡ ΡΠ΅Π·ΠΈ ΡΡΡΡΠΊΡΡΡΠΈ Π΅ ΠΌΠ°ΡΠΈΠ² (?base::array). ΠΠ°ΠΊΡΠΎ Π² Π΄ΡΡΠ³ΠΈ Π΅Π·ΠΈΡΠΈ, ΠΌΠ°ΡΠΈΠ²ΠΈΡΠ΅ ΡΡΠΊ ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅ΡΠ½ΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π΅, ΡΠ΅ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π²ΡΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ ΠΌΠ°ΡΠΈΠ² Π·Π°ΠΏΠΎΡΠ²Π° Π΄Π° Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π° ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΎΡ ΠΊΠ»Π°ΡΠ° ΠΌΠ°ΡΡΠΈΡΠ° (?base::matrix), Π° Π΅Π΄Π½ΠΎΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ ΠΌΠ°ΡΠΈΠ², ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠΎ Π΅ Π²Π°ΠΆΠ½ΠΎ, Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π° ΠΎΡ Π²Π΅ΠΊΡΠΎΡ (?base::vector).
ΠΡΠΈ ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°, ΡΠ΅ ΡΠΈΠΏΡΡ Π΄Π°Π½Π½ΠΈ, ΡΡΠ΄ΡΡΠΆΠ°ΡΠΈ ΡΠ΅ Π² Π½ΡΠΊΠ°ΠΊΡΠ² ΠΎΠ±Π΅ΠΊΡ, ΡΠ»Π΅Π΄Π²Π° Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Ρ ΡΡΠ½ΠΊΡΠΈΡΡΠ° base::typeof, ΠΊΠΎΡΡΠΎ Π²ΡΡΡΠ° Π²ΡΡΡΠ΅ΡΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΈΠΏΠ° ΡΡΠ³Π»Π°ΡΠ½ΠΎ R Internals β ΠΎΠ±ΡΠΈΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π½Π° Π΅Π·ΠΈΠΊΠ°, ΡΠ²ΡΡΠ·Π°Π½ Ρ ΠΏΡΡΠ²ΠΎΡΠΎΠ΄Π½ΠΈΡ C.
ΠΡΠ΅ Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΠΊΠ»Π°ΡΠ° Π½Π° ΠΎΠ±Π΅ΠΊΡΠ°, base::class, Π²ΡΡΡΠ° Π²ΡΠ² ΡΠ»ΡΡΠ°ΠΈ Π½Π° Π²Π΅ΠΊΡΠΎΡΠΈ Π²Π΅ΠΊΡΠΎΡΠ΅Π½ ΡΠΈΠΏ (ΡΠΎΠΉ ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° ΠΏΠΎ ΠΈΠΌΠ΅ ΠΎΡ Π²ΡΡΡΠ΅ΡΠ½ΠΈΡ, Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΡΡΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅ ΡΠΈΠΏΠ° Π½Π° Π΄Π°Π½Π½ΠΈΡΠ΅).
Π‘ΠΏΠΈΡΡΠΊ
ΠΡ Π΄Π²ΡΠΈΠ·ΠΌΠ΅ΡΠ½ΠΈΡ ΠΌΠ°ΡΠΈΠ², ΠΊΠΎΠΉΡΠΎ Π΅ ΠΈ ΠΌΠ°ΡΡΠΈΡΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ ΠΊΡΠΌ ΡΠΏΠΈΡΡΠΊ (?base::list).
ΠΠΎΠ΄
## lists ------------------
mylist <- as.list(arrmatr)
is.vector(mylist)
is.list(mylist)
ΠΡΠΈ ΡΠΎΠ²Π° ΡΡΠ°Π²Π°Ρ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π΅ΡΠ° Π½Π°Π²Π΅Π΄Π½ΡΠΆ:
- ΠΡΠΎΡΠΎΡΠΎ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ°ΡΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΡΠ²ΠΈΠ²Π°, ΡΠΎΠ΅ΡΡ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ ΡΠΏΠΈΡΡΠΊ, ΠΈ Π²Π΅ΠΊΡΠΎΡ.
- Π‘ΠΏΠΈΡΡΠΊΡΡ, ΡΠ°ΠΊΠ°, Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π° ΠΎΡ ΡΠ΅Π·ΠΈ ΠΊΠ»Π°ΡΠΎΠ²Π΅. Π’ΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠΌΠ° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ° Π½Π° ΡΠΏΠΈΡΡΠΊΠ° ΡΠ΅ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π΅Π΄Π½ΠΎ (ΡΠΊΠ°Π»ΡΡΠ½ΠΎ) Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΡ ΠΊΠ»Π΅ΡΠΊΠ°ΡΠ° Π½Π° ΠΌΠ°ΡΡΠΈΡΠ°ΡΠ°-ΠΎΠ±Π΅ΠΊΡ.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΡΠΏΠΈΡΡΠΊΡΡ Π΅ ΡΡΡΠΎ ΠΈ Π²Π΅ΠΊΡΠΎΡ, ΠΊΡΠΌ Π½Π΅Π³ΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° Π²Π΅ΠΊΡΠΎΡΠΈ.
ΠΠ°ΡΠ°ΡΡΠ΅ΠΉΠΌ
ΠΡ ΡΠΏΠΈΡΡΠΊ, ΠΌΠ°ΡΡΠΈΡΠ° ΠΈΠ»ΠΈ Π²Π΅ΠΊΡΠΎΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ ΠΊΡΠΌ Π΄Π°ΡΠ°ΡΡΠ΅ΠΉΠΌ (?base::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.table) ΠΎΡ Π΄Π°ΡΠ°ΡΡΠ΅ΠΉΠΌ, ΡΠΏΠΈΡΡΠΊ, Π²Π΅ΠΊΡΠΎΡ ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠΈΡΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠΎ ΠΊΠ°ΠΊ (in place).
ΠΠΎΠ΄
## data.tables -----------------------
library(data.table)
data.table::setDT(df)
is.list(df)
is.data.frame(df)
is.data.table(df)
ΠΠΎΠ»Π΅Π·Π½ΠΎ Π΅, ΡΠ΅, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π΄Π°ΡΠ°ΡΡΠ΅ΠΉΠΌΡΡ, ΠΠ’ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π° ΡΠ²ΠΎΠΉΡΡΠ²Π° Π½Π° ΡΠΏΠΈΡΡΠΊΠ°.
ΠΠ’ ΠΈ ΠΏΠ°ΠΌΠ΅Ρ
Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π²ΡΠΈΡΠΊΠΈ ΠΎΡΡΠ°Π½Π°Π»ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ Π² R base, DΠ’ ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π°Ρ ΠΏΠΎ ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠΈΡ. ΠΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΊΠΎΠΏΠΈΠ΅ Π² Π½ΠΎΠ²Π° ΠΎΠ±Π»Π°ΡΡ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ°, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° ΡΡΠ½ΠΊΡΠΈΡ 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)
Π‘ ΡΠΎΠ²Π° Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ Π·Π°Π²ΡΡΡΠ²Π°. DΠ’ Π΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΡΡΡΡΠΊΡΡΡΠΈΡΠ΅ ΠΎΡ Π΄Π°Π½Π½ΠΈ Π² R, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΎΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΠΏΡΠ΅Π΄ΠΈΠΌΠ½ΠΎ ΡΡΠ΅Π· ΡΠ°Π·ΡΠΈΡΡΠ²Π°Π½Π΅ ΠΈ ΡΡΠΊΠΎΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΈΠ·Π²ΡΡΡΠ²Π°Π½ΠΈ Π²ΡΡΡ Ρ ΠΎΠ±Π΅ΠΊΡΠΈ ΠΎΡ ΠΊΠ»Π°Ρ Π΄Π°ΡΠ°ΡΡΠ΅ΠΉΠΌ. ΠΡΠΈ ΡΠΎΠ²Π° ΡΠ΅ Π·Π°ΠΏΠ°Π·Π²Π° Π½Π°ΡΠ»Π΅Π΄ΡΡΠ²ΠΎΡΠΎ ΠΎΡ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΈ.
ΠΡΠΊΠΎΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ²ΠΎΠΉΡΡΠ²Π°ΡΠ° Π½Π° data.table
ΠΠ°ΡΠΎ ΡΠΏΠΈΡΡΠΊβ¦
ΠΡΠ΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ ΠΏΠΎ ΡΠ΅Π΄ΠΎΠ²Π΅ΡΠ΅ Π½Π° Π΄Π°ΡΠ°ΡΡΠ΅ΠΉΠΌΠ° ΠΈΠ»ΠΈ DΠ’ Π½Π΅ Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠ°ΡΠ° ΠΈΠ΄Π΅Ρ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΊΠΎΠ΄ΡΡ Π½Π° ΡΠΈΠΊΡΠ»Π° Π½Π° Π΅Π·ΠΈΠΊΠ° 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)))
ΠΠ΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡ
ΠΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΏΡΠ΅Π· ΡΠ΅Π΄ΠΎΠ²Π΅ΡΠ΅ Π½Π° Π³ΠΎΠ»ΡΠΌ DΠ’, Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΎΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ Ρ Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡ. ΠΠΎ Π°ΠΊΠΎ ΡΠΎΠ²Π° Π½Π΅ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΠ΅ ΡΠΈΠΊΡΠ»ΡΡ Π²ΡΡΡΠ΅ DΠ’ Π΅ Π²ΡΠ΅ ΠΏΠ°ΠΊ ΠΏΠΎ-Π±ΡΡΠ· ΠΎΡ ΡΠΈΠΊΡΠ»Π° Π² R, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π½Π° C.
ΠΠ΅ΠΊΠ° ΠΏΡΠΎΠ±Π²Π°ΠΌΠ΅ Π½Π° ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌ ΠΏΡΠΈΠΌΠ΅Ρ Ρ 100Π ΡΠ΅Π΄Π°. Π©Π΅ ΠΈΠ·Π²Π»Π΅ΡΠ΅ΠΌ ΠΏΡΡΠ²Π°ΡΠ° Π±ΡΠΊΠ²Π° ΠΎΡ Π΄ΡΠΌΠΈΡΠ΅, Π²Ρ ΠΎΠ΄ΡΡΠΈ Π² ΠΊΠΎΠ»ΠΎΠ½Π°ΡΠ°-Π²Π΅ΠΊΡΠΎΡ w.
ΠΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΎ
ΠΠΎΠ΄
library(magrittr)
library(microbenchmark)
## ΠΠΎ-Π³ΠΎΠ»ΡΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ----
rown <- 100000
dt %
.[, d := 1 + b + c + rnorm(nrow(.))]
# Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡ
microbenchmark({
dt[
, first_l := unlist(strsplit(w, split = ' ', fixed = T))[1]
, by = 1:nrow(dt)
]
})
# Π²ΡΠΎΡΠΎ
first_l_f %
do.call(rbind, .) %>%
`[`(,1)
}
dt[, first_l := NULL]
microbenchmark({
dt[
, first_l := .(first_l_f(w))
]
})
# ΡΡΠ΅ΡΠΎ
first_l_f2 %
unlist %>%
matrix(nrow = 3) %>%
`[`(1,)
}
dt[, first_l := NULL]
microbenchmark({
dt[
, first_l := .(first_l_f2(w))
]
})
ΠΡΡΠ²ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Ρ ΠΈΡΠ΅ΡΠΈΡΠ°Π½Π΅ ΠΏΠΎ ΡΠ΅Π΄ΠΎΠ²Π΅ΡΠ΅:
ΠΠ΄ΠΈΠ½ΠΈΡΠ°: ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ
expr min
{ dt[, `:=`(first_l, unlist(strsplit(w, split = " ", fixed = T))[1]), by = 1:nrow(dt)] } 439.6217
lq mean median uq max neval
451.9998 460.1593 456.2505 460.9147 621.4042 100
ΠΡΠΎΡΠΈ ΡΠΈΠΊΡΠ», Π² ΠΊΠΎΠΉΡΠΎ Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΡΠ΅Π· ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½Π΅ Π½Π° ΡΠΏΠΈΡΡΠΊ Π² ΠΌΠ°ΡΡΠΈΡΠ° ΠΈ Π²Π·ΠΈΠΌΠ°Π½Π΅ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΠΎΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Ρ ΠΈΠ½Π΄Π΅ΠΊΡ 1 (ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΎΡΠΎ Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡ). Π©Π΅ ΡΠ΅ ΠΏΠΎΠΏΡΠ°Π²Ρ: Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡ Π½Π° Π½ΠΈΠ²ΠΎ ΡΡΠ½ΠΊΡΠΈΡ strsplit, ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΈΠ΅ΠΌΠ° Π²Π΅ΠΊΡΠΎΡ Π½Π° Π²Ρ ΠΎΠ΄. ΠΠΊΠ°Π·Π²Π° ΡΠ΅, ΡΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°ΡΠ° Π·Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½Π΅ Π½Π° ΡΠΏΠΈΡΡΠΊ Π² ΠΌΠ°ΡΡΠΈΡΠ° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡΠ΅ΠΆΠΊΠ° ΠΎΡ ΡΠ°ΠΌΠ°ΡΠ° Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡ, Π½ΠΎ ΠΈ Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ Π΅ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎ-Π±ΡΡΠ·Π° ΠΎΡ Π½Π΅Π²Π΅ΠΊΡΠΎΡΠΈΠ·ΠΈΡΠ°Π½ΠΈΡ Π²Π°ΡΠΈΠ°Π½Ρ.
ΠΠ΄ΠΈΠ½ΠΈΡΠ°: ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄ΠΈ
expr min lq mean median 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 mean median 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 mean median
{ dt[, `:=`((paste0(Β«w_Β», 1:3)), strsplit(w, split = " ", fixed = 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)]
Π’Π΅ΡΠ΅ ΠΏΡΠ΅Π· ΡΡΡΠ±ΠΈΡΠ΅β¦
ΠΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ°Ρ ΡΡΠ΅Π· piping, ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ, Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎ Π΅ ΠΏΠΎ-Π±ΠΎΠ³Π°ΡΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈ, Π° Π½Π΅ ΡΠ°ΠΌΠΎ 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)
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
