ΠžΠΊΠΎΠ»Ρƒ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ.Ρ‚Π°Π±Π΅Π»Π°

Оваа бСлСшка ќС Π±ΠΈΠ΄Π΅ ΠΎΠ΄ интСрСс Π·Π° ΠΎΠ½ΠΈΠ΅ ΠΊΠΎΠΈ ја користат Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ со Ρ‚Π°Π±Π΅Π»ΠΈ Π·Π° 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

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€