Π’Π°Π·ΠΈ Π±Π΅Π»Π΅ΠΆΠΊΠ° ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° ΠΈΠ½ΡΠ΅ΡΠ΅Ρ Π·Π° ΠΎΠ½Π΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° ΡΠ°Π±Π»ΠΈΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ Π·Π° 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)
ΠΠ΄Π½Π° ΡΠ°ΠΊΠ°Π²Π° ΡΡΡΡΠΊΡΡΡΠ° Π΅ ΠΌΠ°ΡΠΈΠ² (?Π±Π°Π·Π°::ΠΌΠ°ΡΠΈΠ²). ΠΠ°ΠΊΡΠΎ ΠΈ Π² Π΄ΡΡΠ³ΠΈ Π΅Π·ΠΈΡΠΈ, ΡΡΠΊ ΠΌΠ°ΡΠΈΠ²ΠΈΡΠ΅ ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎΠΈΠ·ΠΌΠ΅ΡΠ½ΠΈ. ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΡΠΎ ΠΎΠ±Π°ΡΠ΅ Π΅, ΡΠ΅ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π²ΡΠΌΠ΅ΡΠ΅Π½ ΠΌΠ°ΡΠΈΠ² Π·Π°ΠΏΠΎΡΠ²Π° Π΄Π° Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π° ΡΠ²ΠΎΠΉΡΡΠ²Π° ΠΎΡ ΠΌΠ°ΡΡΠΈΡΠ½ΠΈΡ ΠΊΠ»Π°Ρ (?base::matrix), ΠΈ Π΅Π΄Π½ΠΎΠΌΠ΅ΡΠ΅Π½ ΠΌΠ°ΡΠΈΠ², ΠΊΠΎΠΉΡΠΎ ΡΡΡΠΎ Π΅ Π²Π°ΠΆΠ΅Π½, Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π° ΠΎΡ Π²Π΅ΠΊΡΠΎΡ (?Π±Π°Π·Π°::Π²Π΅ΠΊΡΠΎΡ).
Π’ΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ°Π·Π±Π΅ΡΠ΅, ΡΠ΅ ΡΠΈΠΏΡΡ Π΄Π°Π½Π½ΠΈ, ΡΡΠ΄ΡΡΠΆΠ°ΡΠΈ ΡΠ΅ Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΠΎΠ±Π΅ΠΊΡ, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Ρ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π±Π°Π·Π°::ΡΠΈΠΏ, ΠΊΠΎΠ΅ΡΠΎ Π²ΡΡΡΠ° Π²ΡΡΡΠ΅ΡΠ½ΠΎΡΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΈΠΏΠ° ΡΠΏΠΎΡΠ΅Π΄ R Π²ΡΡΡΠ΅ΡΠ½ΠΈ ΡΠ°ΡΡΠΈ - ΠΎΠ±ΡΠΈΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» Π½Π° Π΅Π·ΠΈΠΊΠ°, ΡΠ²ΡΡΠ·Π°Π½ Ρ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π° C.
ΠΡΡΠ³Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° ΠΊΠ»Π°ΡΠ° Π½Π° ΠΎΠ±Π΅ΠΊΡ Π΅ Π±Π°Π·Π° :: ΠΊΠ»Π°Ρ, Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π²Π΅ΠΊΡΠΎΡΠΈ, Π²ΡΡΡΠ° Π²Π΅ΠΊΡΠΎΡΠ½ΠΈΡ ΡΠΈΠΏ (ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° ΡΠ΅ ΠΏΠΎ ΠΈΠΌΠ΅ ΠΎΡ Π²ΡΡΡΠ΅ΡΠ½ΠΈΡ, Π½ΠΎ ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΡΠΈΠΏΠ° Π΄Π°Π½Π½ΠΈ).
Π‘ΠΏΠΈΡΡΠΊ
ΠΡ Π΄Π²ΡΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ ΠΌΠ°ΡΠΈΠ², ΠΈΠ·Π²Π΅ΡΡΠ΅Π½ ΡΡΡΠΎ ΠΊΠ°ΡΠΎ ΠΌΠ°ΡΡΠΈΡΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π΄ΠΎ ΡΠΏΠΈΡΡΠΊΠ° (?base::list).
ΠΠΎΠ΄
## lists ------------------
mylist <- as.list(arrmatr)
is.vector(mylist)
is.list(mylist)
ΠΡΠΊΠΎΠ»ΠΊΠΎ Π½Π΅ΡΠ° ΡΠ΅ ΡΠ»ΡΡΠ²Π°Ρ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ:
- ΠΡΠΎΡΠΎΡΠΎ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΌΠ°ΡΡΠΈΡΠ°ΡΠ° ΡΠ΅ ΡΠ²ΠΈΠ²Π°, ΡΠΎΠ΅ΡΡ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΈ ΡΠΏΠΈΡΡΠΊ, ΠΈ Π²Π΅ΠΊΡΠΎΡ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ.
- ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΠΏΠΈΡΡΠΊΡΡ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π° ΠΎΡ ΡΠ΅Π·ΠΈ ΠΊΠ»Π°ΡΠΎΠ²Π΅. Π’ΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠΌΠ° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½Ρ ΠΎΡ ΡΠΏΠΈΡΡΠΊ ΡΠ΅ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π° Π½Π° Π΅Π΄Π½Π° (ΡΠΊΠ°Π»Π°ΡΠ½Π°) ΡΡΠΎΠΉΠ½ΠΎΡΡ ΠΎΡ ΠΊΠ»Π΅ΡΠΊΠ° ΠΎΡ ΠΌΠ°ΡΡΠΈΡΠ°ΡΠ° Π½Π° ΠΌΠ°ΡΠΈΠ²Π°.
Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠΏΠΈΡΡΠΊΡΡ ΡΡΡΠΎ Π΅ Π²Π΅ΠΊΡΠΎΡ, Π½ΡΠΊΠΎΠΈ Π²Π΅ΠΊΡΠΎΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈ ΠΊΡΠΌ Π½Π΅Π³ΠΎ.
Dataframe
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΡΠ΅ ΠΎΡ ΡΠΏΠΈΡΡΠΊ, ΠΌΠ°ΡΡΠΈΡΠ° ΠΈΠ»ΠΈ Π²Π΅ΠΊΡΠΎΡ ΠΊΡΠΌ ΡΠ°ΠΌΠΊΠ° Ρ Π΄Π°Π½Π½ΠΈ (?base::data.frame).
ΠΠΎΠ΄
## data.frames ------------
df <- as.data.frame(arrmatr)
df2 <- as.data.frame(mylist)
is.list(df)
df$V6 <- df$V1 + df$V2
ΠΠ°ΠΊΠ²ΠΎ Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ Π·Π° Π½Π΅Π³ΠΎ: ΡΠ°ΠΌΠΊΠ°ΡΠ° Ρ Π΄Π°Π½Π½ΠΈ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π° ΠΎΡ ΡΠΏΠΈΡΡΠΊΠ°! ΠΠΎΠ»ΠΎΠ½ΠΈΡΠ΅ Π½Π° Dataframe ΡΠ° ΠΊΠ»Π΅ΡΠΊΠΈ ΠΎΡ ΡΠΏΠΈΡΡΠΊ. Π’ΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈ ΠΊΡΠΌ ΡΠΏΠΈΡΡΡΠΈ.
ΡΠ°Π±Π»ΠΈΡΠ° Ρ Π΄Π°Π½Π½ΠΈ
ΠΠ·Π΅ΠΌΠ΅ΡΠ΅ 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 Π΄Π° Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π° ΡΠ²ΠΎΠΉΡΡΠ²Π°ΡΠ° Π½Π° ΡΠΏΠΈΡΡΠΊ.
DT ΠΈ ΠΏΠ°ΠΌΠ΅Ρ
ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ Π²ΡΠΈΡΠΊΠΈ Π΄ΡΡΠ³ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ Π² R base, DT ΡΠ΅ ΠΏΡΠ΅Π΄Π°Π²Π°Ρ ΠΏΠΎ ΡΠ΅ΡΠ΅ΡΠ΅Π½ΡΠΈΡ. ΠΠΊΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΊΠΎΠΏΠΈΠ΅ Π² Π½ΠΎΠ²Π° ΠΎΠ±Π»Π°ΡΡ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ°, ΠΈΠΌΠ°ΡΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΡΡΠ½ΠΊΡΠΈΡ 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)
Π’ΠΎΠ²Π° Π·Π°Π²ΡΡΡΠ²Π° Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ. DT Π΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΡΡΡΡΠΊΡΡΡΠΈΡΠ΅ ΠΎΡ Π΄Π°Π½Π½ΠΈ Π² R, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π΄ΡΠ»ΠΆΠΈ Π³Π»Π°Π²Π½ΠΎ Π½Π° ΡΠ°Π·ΡΠΈΡΡΠ²Π°Π½Π΅ΡΠΎ ΠΈ ΡΡΠΊΠΎΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈΡΠ΅, ΠΈΠ·Π²ΡΡΡΠ²Π°Π½ΠΈ Π²ΡΡΡ Ρ ΠΎΠ±Π΅ΠΊΡΠΈ ΠΎΡ ΠΊΠ»Π°ΡΠ° dataframe. Π ΡΡΡΠΎΡΠΎ Π²ΡΠ΅ΠΌΠ΅ ΡΠ΅ Π·Π°ΠΏΠ°Π·Π²Π° Π½Π°ΡΠ»Π΅Π΄ΡΡΠ²ΠΎΡΠΎ ΠΎΡ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΈ.
ΠΡΠΊΠΎΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ²ΠΎΠΉΡΡΠ²Π° Π½Π° 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.
ΠΠ΅ΠΊΠ° ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π½Π° ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΡΡΡ 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 neval
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 ΠΊΠ»Π°ΡΠΎΠ²Π΅, ΠΈ Π·Π°Π²ΡΡΡΠ²Π°ΠΉΠΊΠΈ ΡΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΡΠ΅ ΠΌΡ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΡΡΠ΅Π΄Π° ΠΎΡ 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
