ΠΠ²Π° Π½Π°ΠΏΠΎΠΌΠ΅Π½Π° ΡΠ΅ Π±ΠΈΡΠΈ ΠΎΠ΄ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ° Π·Π° ΠΎΠ½Π΅ ΠΊΠΎΡΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ ΡΠ°Π±Π΅Π»Π°ΡΠ½Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π·Π° ΠΎΠ±ΡΠ°Π΄Ρ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Π·Π° Π - Π΄Π°ΡΠ°.ΡΠ°Π±Π»Π΅, ΠΈ ΠΌΠΎΠΆΠ΄Π° ΡΠ΅ ΠΈΠΌ Π±ΠΈΡΠΈ Π΄ΡΠ°Π³ΠΎ Π΄Π° Π²ΠΈΠ΄Π΅ ΡΠ»Π΅ΠΊΡΠΈΠ±ΠΈΠ»Π½ΠΎΡΡ ΡΠ΅Π½Π΅ ΡΠΏΠΎΡΡΠ΅Π±Π΅ Ρ ΡΠ°Π·Π»ΠΈΡΠΈΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΈΠΌΠ°.
ΠΠ½ΡΠΏΠΈΡΠΈΡΠ°Π½ Π΄ΠΎΠ±ΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ , ΠΈ Ρ Π½Π°Π΄ΠΈ Π΄Π° ΡΡΠ΅ Π²Π΅Ρ ΠΏΡΠΎΡΠΈΡΠ°Π»ΠΈ ΡΠ΅Π³ΠΎΠ² ΡΠ»Π°Π½Π°ΠΊ, ΠΏΡΠ΅Π΄Π»Π°ΠΆΠ΅ΠΌ Π΄Π° ΠΊΠΎΠΏΠ°ΠΌΠΎ Π΄ΡΠ±ΡΠ΅ Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΡ ΠΊΠΎΠ΄Π° ΠΈ ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠ΅ Π·Π°ΡΠ½ΠΎΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΈ.ΡΠ°Π±Π΅Π»Π°.
Π£Π²ΠΎΠ΄: ΠΠ΄Π°ΠΊΠ»Π΅ Π΄ΠΎΠ»Π°Π·ΠΈ Π΄Π°ΡΠ°.ΡΠ°Π±Π»Π΅?
ΠΠ°ΡΠ±ΠΎΡΠ΅ ΡΠ΅ Π΄Π° ΡΠ΅ ΡΠΏΠΎΠ·Π½Π°ΡΠ΅ ΡΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΌ ΠΌΠ°Π»ΠΎ ΠΈΠ·Π΄Π°Π»Π΅ΠΊΠ°, Π½Π°ΠΈΠΌΠ΅, ΡΠ° ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠ° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΠΈΠ· ΠΊΠΎΡΠΈΡ ΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄ΠΎΠ±ΠΈΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΠ°Ρ Π΄Π°ΡΠ°.ΡΠ°Π±Π»Π΅ (Ρ Π΄Π°ΡΠ΅ΠΌ ΡΠ΅ΠΊΡΡΡ ΠΠ’).
ΠΡΡΠ°ΠΈ
ΠΠΎΠ΄
## 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
Π¨ΡΠ° ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ°Π½ΡΠ½ΠΎ Ρ Π²Π΅Π·ΠΈ ΡΠ° ΡΠΈΠΌ: ΠΎΠΊΠ²ΠΈΡ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Π½Π°ΡΠ»Π΅ΡΡΡΠ΅ ΡΠ° Π»ΠΈΡΡΠ΅! ΠΠΎΠ»ΠΎΠ½Π΅ ΠΎΠΊΠ²ΠΈΡΠ° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΡΡ ΡΠ΅Π»ΠΈΡΠ΅ Π»ΠΈΡΡΠ΅. ΠΠ²ΠΎ ΡΠ΅ Π±ΠΈΡΠΈ Π²Π°ΠΆΠ½ΠΎ ΠΊΠ°ΡΠ½ΠΈΡΠ΅ ΠΊΠ°Π΄Π° Π±ΡΠ΄Π΅ΠΌΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅Π½Π΅ Π½Π° Π»ΠΈΡΡΠ΅.
ΠΏΠΎΠ΄Π°ΡΠΈ.ΡΠ°Π±Π΅Π»Π°
Π£Π·ΠΌΠΈ ΠΠ’ (?Π΄Π°ΡΠ°.ΡΠ°Π±Π»Π΅::Π΄Π°ΡΠ°.ΡΠ°Π±Π»Π΅) ΠΌΠΎΠΆΠ΅ Π±ΠΈΡΠΈ ΠΎΠ΄ ΠΎΠΊΠ²ΠΈΡ ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ°, Π»ΠΈΡΡΠ°, Π²Π΅ΠΊΡΠΎΡ ΠΈΠ»ΠΈ ΠΌΠ°ΡΡΠΈΡΠ°. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΠ²Π°ΠΊΠΎ (Π½Π° ΠΌΠ΅ΡΡΡ).
ΠΠΎΠ΄
## data.tables -----------------------
library(data.table)
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)
ΠΠ²ΠΈΠΌ ΡΠ΅ Π·Π°Π²ΡΡΠ°Π²Π° ΡΠ²ΠΎΠ΄. ΠΠ’ ΡΠ΅ Π½Π°ΡΡΠ°Π²Π°ΠΊ ΡΠ°Π·Π²ΠΎΡΠ° ΡΡΡΡΠΊΡΡΡΠ° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° Ρ Π , ΠΊΠΎΡΠΈ ΡΠ³Π»Π°Π²Π½ΠΎΠΌ Π½Π°ΡΡΠ°ΡΠ΅ ΡΡΠ»Π΅Π΄ ΠΏΡΠΎΡΠΈΡΠ΅ΡΠ° ΠΈ ΡΠ±ΡΠ·Π°ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠ° ΠΊΠΎΡΠ΅ ΡΠ΅ ΠΎΠ±Π°Π²ΡΠ°ΡΡ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡΠΈΠΌΠ° ΠΊΠ»Π°ΡΠ΅ Π΄Π°ΡΠ°ΡΡΠ°ΠΌΠ΅. ΠΡΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½ΠΎ, ΠΎΡΡΠ²Π°Π½ΠΎ ΡΠ΅ Π½Π°ΡΠ»Π΅ΡΠ΅ ΠΎΠ΄ Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π°ΡΠ°.
ΠΠ΅ΠΊΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ° ΡΠ²ΠΎΡΡΡΠ°Π²Π° Π΄Π°ΡΠ°.ΡΠ°Π±Π»Π΅
ΠΠ°ΠΎ ΡΠΏΠΈΡΠ°ΠΊ...
ΠΡΠ΅ΡΠ°ΡΠΈΡΠ° ΠΏΡΠ΅ΠΊΠΎ ΡΠ΅Π΄ΠΎΠ²Π° ΠΎΠΊΠ²ΠΈΡΠ° ΠΏΠΎΠ΄Π°ΡΠ°ΠΊΠ° ΠΈΠ»ΠΈ ΠΠ’ Π½ΠΈΡΠ΅ Π΄ΠΎΠ±ΡΠ° ΠΈΠ΄Π΅ΡΠ°, ΠΏΠΎΡΡΠΎ ΠΊΠΎΠ΄ ΠΏΠ΅ΡΡΠ΅ Ρ ΡΠ΅Π·ΠΈΠΊΡ 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.
Π₯Π°ΡΠ΄Π΅ Π΄Π° ΠΏΡΠΎΠ±Π°ΠΌΠΎ Π½Π° Π²Π΅ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΠ° 100Π ΡΠ΅Π΄ΠΎΠ²Π°. ΠΡΠ²ΠΎ ΡΠ»ΠΎΠ²ΠΎ ΡΠ΅ΠΌΠΎ ΠΈΠ·Π΄Π²ΠΎΡΠΈΡΠΈ ΠΈΠ· ΡΠ΅ΡΠΈ ΡΠΊΡΡΡΠ΅Π½ΠΈΡ Ρ ΠΊΠΎΠ»ΠΎΠ½Ρ Π²Π΅ΠΊΡΠΎΡΠ° 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))
]
})
ΠΡΠ²ΠΎ ΠΏΠΎΠΊΡΠ΅Π½ΠΈΡΠ΅ ΠΏΠΎΠ½Π°Π²ΡΠ°ΡΠ΅ ΡΠ΅Π΄ΠΎΠ²Π°:
ΠΠ΅Π΄ΠΈΠ½ΠΈΡΠ°: ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π΅
Π΅ΠΊΡΠΏΡ ΠΌΠΈΠ½
{ Π΄Ρ[, `:=`(ΠΏΡΠ²ΠΈ_Π», ΡΠ½Π»ΠΈΡΡ(ΡΡΡΡΠΏΠ»ΠΈΡ(Π², ΡΠΏΠ»ΠΈΡ = " ", ΡΠΈΠΊΡΠ½ΠΎ = Π’))[1]), Π±ΠΈ = 1:Π½ΡΠΎΠ²(Π΄Ρ)] } 439.6217
Π»ΠΊ ΡΡΠ΅Π΄ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ ΡΠΊ ΠΌΠ°ΠΊ Π½Π΅Π²Π°Π»
451.9998 460.1593 456.2505 460.9147 621.4042 100
ΠΡΡΠ³ΠΎ ΠΏΠΎΠΊΡΠ΅ΡΠ°ΡΠ΅, Π³Π΄Π΅ ΡΠ΅ Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ° Π΄Π΅ΡΠ°Π²Π° ΠΏΡΠ΅ΡΠ²Π°ΡΠ°ΡΠ΅ΠΌ Π»ΠΈΡΡΠ΅ Ρ ΠΌΠ°ΡΡΠΈΡΡ ΠΈ ΡΠ·ΠΈΠΌΠ°ΡΠ΅ΠΌ Π΅Π»Π΅ΠΌΠ΅Π½Π°ΡΠ° Π½Π° ΠΏΡΠ΅ΡΠ΅ΠΊΡ ΡΠ° ΠΈΠ½Π΄Π΅ΠΊΡΠΎΠΌ 1 (ΠΏΠΎΡΠΎΡΠΈ ΡΠ΅ ΡΠ°ΠΌΠ° Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ°). ΠΡΠΏΡΠ°Π²ΠΊΠ°: Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° Π½ΠΈΠ²ΠΎΡ ΡΡΠ½ΠΊΡΠΈΡΠ΅ ΡΡΡΡΠΏΠ»ΠΈΡ, ΠΊΠΎΡΠΈ ΠΌΠΎΠΆΠ΅ ΠΏΡΠΈΡ Π²Π°ΡΠΈΡΠΈ Π²Π΅ΠΊΡΠΎΡ ΠΊΠ°ΠΎ ΡΠ»Π°Π·. ΠΡΠΏΠΎΡΡΠ°Π²ΠΈΠ»ΠΎ ΡΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΡΠΏΠ°ΠΊ ΠΏΡΠ΅ΡΠ²Π°ΡΠ°ΡΠ° Π»ΠΈΡΡΠ΅ Ρ ΠΌΠ°ΡΡΠΈΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΅ΠΆΠΈ ΠΎΠ΄ ΡΠ°ΠΌΠ΅ Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ΅, Π°Π»ΠΈ ΡΠ΅ Ρ ΠΎΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡΠΆΠΈ ΠΎΠ΄ Π½Π΅Π²Π΅ΠΊΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½Π΅ Π²Π΅ΡΠ·ΠΈΡΠ΅.
ΠΠ΅Π΄ΠΈΠ½ΠΈΡΠ°: ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π΅
Π΅ΠΊΡΠΏΡ ΠΌΠΈΠ½ Π»ΠΊ ΡΡΠ΅Π΄ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ ΡΠΊ ΠΌΠ°ΠΊ Π½Π΅Π²Π°Π»
{ Π΄Ρ[, `:=`(ΠΏΡΠ²ΠΈ_Π», .(ΠΏΡΠ²ΠΈ_Π»_Ρ(Π²)))] } 93.07916 112.1381 161.9267 149.6863 185.9893 442.5199 100
Π£Π±ΡΠ·Π°ΡΠ΅ ΠΏΠΎ ΠΌΠ΅Π΄ΠΈΡΠ°Π½ΠΈ ΠΈΠ½ ΠΠ‘ΠΠ£ΠΠΠ‘ ΠΏΡΡΠ°.
Π’ΡΠ΅ΡΠ° ΡΠ΅ΡΠΈΡΠ°, Π³Π΄Π΅ ΡΠ΅ ΠΏΡΠΎΠΌΠ΅ΡΠ΅Π½Π° ΡΠ΅ΠΌΠ° ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡΠ΅ Ρ ΠΌΠ°ΡΡΠΈΡΡ.
ΠΠ΅Π΄ΠΈΠ½ΠΈΡΠ°: ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π΅
Π΅ΠΊΡΠΏΡ ΠΌΠΈΠ½ Π»ΠΊ ΡΡΠ΅Π΄ΡΠ° Π²ΡΠ΅Π΄Π½ΠΎΡΡ ΡΠΊ ΠΌΠ°ΠΊ Π½Π΅Π²Π°Π»
{ Π΄Ρ[, `:=`(ΠΏΡΠ²ΠΈ_Π», .(ΠΏΡΠ²ΠΈ_Π»_Ρ2(Π²)))] } 32.60481 34.13679 40.4544 35.57115 42.11975 222.972 100
Π£Π±ΡΠ·Π°ΡΠ΅ ΠΏΠΎ ΠΌΠ΅Π΄ΠΈΡΠ°Π½ΠΈ ΠΈΠ½ ΠΠ‘ΠΠ£ΠΠΠ‘ ΠΏΡΡΠ°.
ΠΠΎΡΠ°ΡΠ΅ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠΈ ΡΠ° ΠΎΠ²ΠΎΠΌ ΠΌΠ°ΡΠ΅ΡΠΈΡΠΎΠΌ, ΡΡΠΎ Π²ΠΈΡΠ΅, ΡΠΎ ΡΠ΅ Π±ΠΈΡΠΈ Π±ΠΎΡΠ΅.
ΠΠΎΡ ΡΠ΅Π΄Π°Π½ ΠΏΡΠΈΠΌΠ΅Ρ ΡΠ° Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠΎΠΌ, Π³Π΄Π΅ ΡΠ°ΠΊΠΎΡΠ΅ ΠΏΠΎΡΡΠΎΡΠΈ ΡΠ΅ΠΊΡΡ, Π°Π»ΠΈ ΡΠ΅ Π±Π»ΠΈΠ·Π°ΠΊ ΡΠ΅Π°Π»Π½ΠΈΠΌ ΡΡΠ»ΠΎΠ²ΠΈΠΌΠ°: ΡΠ°Π·Π»ΠΈΡΠΈΡΠ΅ Π΄ΡΠΆΠΈΠ½Π΅ ΡΠ΅ΡΠΈ, ΡΠ°Π·Π»ΠΈΡΠΈΡ Π±ΡΠΎΡ ΡΠ΅ΡΠΈ. ΠΠΎΡΠ°ΡΠ΅ Π΄Π° Π΄ΠΎΠ±ΠΈΡΠ΅ΡΠ΅ ΠΏΡΠ²Π΅ 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))
]
ΠΠ΅Π΄ΠΈΠ½ΠΈΡΠ°: ΠΌΠΈΠ»ΠΈΡΠ΅ΠΊΡΠ½Π΄Π΅
Π΅ΠΊΡΠΏΡ ΠΌΠΈΠ½ Π»ΠΊ ΡΡΠ΅Π΄ΡΠ° ΠΌΠ΅Π΄ΠΈΡΠ°Π½Π°
{ Π΄Ρ[, `:=`((ΠΏΠ°ΡΡΠ΅0(βΠ²_β, 1:3)), ΡΡΡΡΠΏΠ»ΠΈΡ(Π², ΡΠΏΠ»ΠΈΡ = " ", ΡΠΈΠΊΡΠ½ΠΎ = Π’))] } 851.7623 916.071 1054.5 1035.199
ΡΠΊ ΠΌΠ°ΠΊ Π½Π΅Π²Π°Π»
1178.738 1356.816 100
Π‘ΡΠ΅Π½Π°ΡΠΈΠΎ ΡΠ΅ ΡΠ°Π΄ΠΈΠΎ ΠΏΡΠΎΡΠ΅ΡΠ½ΠΎΠΌ Π±ΡΠ·ΠΈΠ½ΠΎΠΌ ΠΎΠ΄ 1 ΡΠ΅ΠΊΡΠ½Π΄Π΅. ΠΠΈΡΠ΅ Π»ΠΎΡΠ΅.
ΠΠΎΠ²Π΅Π·Π°Π½ΠΈ ΡΠ΅Π΄Π½ΠΈΠΌ Π»Π°Π½ΡΠ΅ΠΌ...
ΠΠΎΠΆΠ΅ΡΠ΅ ΡΠ°Π΄ΠΈΡΠΈ ΡΠ° ΠΠ’ ΠΎΠ±ΡΠ΅ΠΊΡΠΈΠΌΠ° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠΈ ΡΠ»Π°Π½ΡΠ°Π²Π°ΡΠ΅. ΠΠ·Π³Π»Π΅Π΄Π° ΠΊΠ°ΠΎ Π΄ΠΎΠ΄Π°Π²Π°ΡΠ΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠ΅ Π·Π°Π³ΡΠ°Π΄Π΅ Π½Π° Π΄Π΅ΡΠ½ΠΎ, Ρ ΡΡΡΡΠΈΠ½ΠΈ ΡΠ΅ΡΠ΅Ρ.
ΠΠΎΠ΄
# 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)
ΠΠ°ΠΊΡΡΡΠ°ΠΊ
ΠΠ°Π΄Π°ΠΌ ΡΠ΅ Π΄Π° ΡΠ°ΠΌ ΡΡΠΏΠ΅ΠΎ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΏΠΎΡΠΏΡΠ½Ρ, Π°Π»ΠΈ, Π½Π°ΡΠ°Π²Π½ΠΎ, Π½Π΅ ΠΏΠΎΡΠΏΡΠ½Ρ ΡΠ»ΠΈΠΊΡ ΡΠ°ΠΊΠ²ΠΎΠ³ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊΠ°ΠΎ ΡΡΠΎ ΡΠ΅ Π΄Π°ΡΠ°.ΡΠ°Π±Π»Π΅, ΠΏΠΎΡΠ΅Π²ΡΠΈ ΠΎΠ΄ ΡΠ΅Π³ΠΎΠ²ΠΈΡ ΡΠ²ΠΎΡΡΡΠ°Π²Π° ΠΏΠΎΠ²Π΅Π·Π°Π½ΠΈΡ ΡΠ° Π½Π°ΡΠ»Π΅ΡΠΈΠ²Π°ΡΠ΅ΠΌ ΠΎΠ΄ Π ΠΊΠ»Π°ΡΠ° ΠΈ Π·Π°Π²ΡΡΠ°Π²Π°ΡΡΡΠΈ ΡΠΎΠΏΡΡΠ²Π΅Π½ΠΈΠΌ ΠΊΠ°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ°ΠΌΠ° ΠΈ ΠΎΠΊΡΡΠΆΠ΅ΡΠ΅ΠΌ ΠΎΠ΄ ΡΠΈΠ΄ΠΈΠ²Π΅ΡΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½Π°ΡΠ° . ΠΠ°Π΄Π°ΠΌ ΡΠ΅ Π΄Π° ΡΠ΅ Π²Π°ΠΌ ΠΎΠ²ΠΎ ΠΏΠΎΠΌΠΎΡΠΈ Π΄Π° Π±ΠΎΡΠ΅ Π½Π°ΡΡΠΈΡΠ΅ ΠΈ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΎΠ²Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π·Π° ΡΠ°Π΄ ΠΈ Π·Π°Π±Π°Π²Π°.

Π₯Π²Π°Π»Π°!
ΠΡΠ½ ΠΊΠΎΠ΄
ΠΠΎΠ΄
## 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)
ΠΠ·Π²ΠΎΡ: Π²Π²Π².Ρ Π°Π±Ρ.ΡΠΎΠΌ
