ΠΡΠ° Π·Π°ΠΌΠ΅ΡΠΊΠ° Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° Π΄Π»Ρ ΡΠ΅Ρ , ΠΊΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ°Π±Π»ΠΈΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ R β 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, ΠΠ’ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΏΠΎ ΡΡΡΠ»ΠΊΠ΅. ΠΡΠ»ΠΈ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π½ΠΎΠ²ΡΡ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ, Π½ΡΠΆΠ½Π° ΡΡΠ½ΠΊΡΠΈΡ 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)
ΠΠ° ΡΡΠΎΠΌ Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ ΠΊ ΠΊΠΎΠ½ΡΡ. ΠΠ’ β ΡΡΠΎ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°Π·Π²ΠΈΡΠΈΡ ΡΡΡΡΠΊΡΡΡ Π΄Π°Π½Π½ΡΡ Π² R, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π·Π° ΡΡΠ΅Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΠΈ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΡΡ Π½Π°Π΄ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΠΊΠ»Π°ΡΡΠ° Π΄Π°ΡΠ°ΡΡΠ΅ΠΉΠΌ. ΠΡΠΈ ΡΡΠΎΠΌ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ Π΄ΡΡΠ³ΠΈΡ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠ².
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ²ΠΎΠΉΡΡΠ² data.table
ΠΠ°ΠΊ ΡΠΏΠΈΡΠΎΠΊ…
ΠΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎ ΡΡΡΠΎΠΊΠ°ΠΌ Π΄Π°ΡΠ°ΡΡΠ΅ΠΉΠΌΠ° ΠΈΠ»ΠΈ ΠΠ’ Π½Π΅ Π»ΡΡΡΠ°Ρ ΠΈΠ΄Π΅Ρ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄ ΡΠΈΠΊΠ»Π° Π½Π° ΡΠ·ΡΠΊΠ΅ 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.
Updated
ΠΠΎΠ΄
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))
]
})
ΠΠ΅ΡΠ²ΡΠΉ ΠΏΡΠΎΠ³ΠΎΠ½ Ρ ΠΈΡΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ ΠΏΠΎ ΡΡΡΠΎΠΊΠ°ΠΌ:
Unit: milliseconds
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, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠΌΠ΅Π΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ Π²Π΅ΠΊΡΠΎΡ Π½Π° Π²Ρ ΠΎΠ΄. ΠΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° ΠΏΡΠ΅Π²ΡΠ°ΡΠ΅Π½ΠΈΡ ΡΠΏΠΈΡΠΊΠ° Π² ΠΌΠ°ΡΡΠΈΡΡ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠΆΠ΅Π»Π΅Π΅ ΡΠ°ΠΌΠΎΠΉ Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ, Π½ΠΎ ΠΈ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΡΡΡΡΠ΅Π΅ Π½Π΅Π²Π΅ΠΊΡΠΎΡΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ°.
Unit: milliseconds
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 ΡΠ°Π·.
Π’ΡΠ΅ΡΠΈΠΉ ΠΏΡΠΎΠ³ΠΎΠ½, Π³Π΄Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π° ΡΡ Π΅ΠΌΠ° ΠΏΡΠ΅Π²ΡΠ°ΡΠ΅Π½ΠΈΡ Π² ΠΌΠ°ΡΡΠΈΡΡ.
Unit: milliseconds
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))
]
Unit: milliseconds
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 ΡΠ΅ΠΊΡΠ½Π΄Π°. ΠΠ΅ΠΏΠ»ΠΎΡ ΠΎ.
Π‘Π²ΡΠ·Π°Π½Π½ΡΠ΅ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅ΠΏΡΡ…
Π‘ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ ΠΠ’ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ chaining. ΠΡΠ³Π»ΡΠ΄ΠΈΡ ΡΡΠΎ ΠΊΠ°ΠΊ ΠΏΡΠΈΡΠ΅ΠΏΠ»Π΅Π½ΠΈΠ΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΊΠΎΠ±ΠΎΠΊ ΡΠΏΡΠ°Π²Π°, ΠΏΠΎ ΡΡΡΠΈ, ΡΠ°Ρ Π°ΡΠΎΠΊ.
ΠΠΎΠ΄
# 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, Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΏΠΎΡ ΠΎΠΆΠ΅, Π½ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ Π±ΠΎΠ³Π°ΡΠ΅, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π»ΡΠ±ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ, Π° Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΠ’. ΠΡΠ²Π΅Π΄Π΅ΠΌ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΡ Π»ΠΎΠ³ΠΈΡΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅Π³ΡΠ΅ΡΡΠΈΠΈ Π΄Π»Ρ Π½Π°ΡΠΈΡ ΡΠΈΠ½ΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ Π΄Π°Π½Π½ΡΡ Ρ ΡΡΠ΄ΠΎΠΌ ΡΠΈΠ»ΡΡΡΠΎΠ² Π½Π° ΠΠ’.
ΠΠΎΠ΄
# 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)
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π― Π½Π°Π΄Π΅ΡΡΡ, ΡΡΠΎ ΡΠΌΠΎΠ³ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ΅Π»ΡΠ½ΡΡ, Π½ΠΎ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π½Π΅ ΠΏΠΎΠ»Π½ΡΡ, ΠΊΠ°ΡΡΠΈΠ½Ρ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΊΠ°ΠΊ 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