Око ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ°.Ρ‚Π°Π±Π΅Π»Π°

Ова Π½Π°ΠΏΠΎΠΌΠ΅Π½Π° Ρ›Π΅ Π±ΠΈΡ‚ΠΈ ΠΎΠ΄ интСрСса Π·Π° ΠΎΠ½Π΅ који користС Ρ‚Π°Π±Π΅Π»Π°Ρ€Π½Ρƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π·Π° ΠΎΠ±Ρ€Π°Π΄Ρƒ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Π·Π° Π  - Π΄Π°Ρ‚Π°.Ρ‚Π°Π±Π»Π΅, ΠΈ ΠΌΠΎΠΆΠ΄Π° Ρ›Π΅ ΠΈΠΌ Π±ΠΈΡ‚ΠΈ Π΄Ρ€Π°Π³ΠΎ Π΄Π° Π²ΠΈΠ΄Π΅ флСксибилност њСнС ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π΅ Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈΠΌΠ°.

Π˜Π½ΡΠΏΠΈΡ€ΠΈΡΠ°Π½ Π΄ΠΎΠ±Ρ€ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ КолСгС, ΠΈ Ρƒ Π½Π°Π΄ΠΈ Π΄Π° стС Π²Π΅Ρ› ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ њСгов Ρ‡Π»Π°Π½Π°ΠΊ, ΠΏΡ€Π΅Π΄Π»Π°ΠΆΠ΅ΠΌ Π΄Π° ΠΊΠΎΠΏΠ°ΠΌΠΎ Π΄ΡƒΠ±Ρ™Π΅ Ρƒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ˜Ρƒ ΠΊΠΎΠ΄Π° ΠΈ пСрформансС заснованС Π½Π° ΠΏΠΎΠ΄Π°Ρ†ΠΈ.Ρ‚Π°Π±Π΅Π»Π°.

Π£Π²ΠΎΠ΄: ОдаклС Π΄ΠΎΠ»Π°Π·ΠΈ Π΄Π°Ρ‚Π°.Ρ‚Π°Π±Π»Π΅?

ΠΠ°Ρ˜Π±ΠΎΡ™Π΅ јС Π΄Π° сС ΡƒΠΏΠΎΠ·Π½Π°Ρ‚Π΅ са Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΌ ΠΌΠ°Π»ΠΎ ΠΈΠ·Π΄Π°Π»Π΅ΠΊΠ°, Π½Π°ΠΈΠΌΠ΅, са структурама ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° ΠΈΠ· ΠΊΠΎΡ˜ΠΈΡ… сС ΠΌΠΎΠΆΠ΅ Π΄ΠΎΠ±ΠΈΡ‚ΠΈ ΠΎΠ±Ρ˜Π΅ΠΊΠ°Ρ‚ Π΄Π°Ρ‚Π°.Ρ‚Π°Π±Π»Π΅ (Ρƒ Π΄Π°Ρ™Π΅ΠΌ тСксту Π”Π’).

Арраи

Код

## 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)

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

ΠšΡƒΠΏΠΈΡ‚Π΅ ΠΏΠΎΡƒΠ·Π΄Π°Π½ хостинг Π·Π° ΡΠ°Ρ˜Ρ‚ΠΎΠ²Π΅ са Π”Π”ΠΎΠ‘ Π·Π°ΡˆΡ‚ΠΈΡ‚ΠΎΠΌ, Π’ΠŸΠ‘ Π’Π”Π‘ сСрвСрС πŸ”₯ ΠšΡƒΠΏΠΈΡ‚Π΅ ΠΏΠΎΡƒΠ·Π΄Π°Π½ Π²Π΅Π± хостинг са DDoS Π·Π°ΡˆΡ‚ΠΈΡ‚ΠΎΠΌ, VPS VDS сСрвСрС | ProHoster