เบ›เบฐเบกเบฒเบ™ data.table

เบšเบฑเบ™เบ—เบถเบเบ™เบตเป‰เบˆเบฐเบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเบเบฑเบšเบœเบนเป‰เบ—เบตเปˆเปƒเบŠเป‰เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบเบฒเบ™เบ›เบธเบ‡เปเบ•เปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡เบชเปเบฒเบฅเบฑเบš 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)

เบซเบ™เบถเปˆเบ‡เปƒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปเบกเปˆเบ™ array (?เบ–เบฒเบ™::เบญเบฒเป€เบฃ). เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบžเบฒเบชเบฒเบญเบทเปˆเบ™เป†, arrays เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เปเบกเปˆเบ™เบกเบตเบซเบผเบฒเบเบกเบดเบ•เบด. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบชเบดเปˆเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเปเบกเปˆเบ™เบงเปˆเบฒ, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, array เบชเบญเบ‡เบกเบดเบ•เบดเบฅเบฐเบ”เบฑเบšเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ—เบตเปˆเบˆเบฐเบชเบทเบšเบ—เบญเบ”เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบˆเบฒเบเบซเป‰เบญเบ‡เบฎเบฝเบ™ matrix. (?เบ–เบฒเบ™::matrix), เปเบฅเบฐ array เบกเบดเบ•เบดเบกเบดเบ•เบดเบซเบ™เบถเปˆเบ‡, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™, เบšเปเปˆเป„เบ”เป‰เบชเบทเบšเบ—เบญเบ”เบˆเบฒเบ vector (?เบ–เบฒเบ™::vector).

เบกเบฑเบ™เบ„เบงเบ™เบˆเบฐเป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบกเบตเบขเบนเปˆเปƒเบ™เบงเบฑเบ”เบ–เบธเปƒเบ”เบซเบ™เบถเปˆเบ‡เบ„เบงเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบเบงเบ”เบชเบญเบšเป‚เบ”เบเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ เบ–เบฒเบ™::typeof, เป€เบŠเบดเปˆเบ‡เบชเบปเปˆเบ‡เบ„เบทเบ™เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ›เบฐเป€เบžเบ”เบžเบฒเบเปƒเบ™เบ•เบฒเบก R เบžเบฒเบเปƒเบ™ - เบžเบดเบ—เบตเบเบฒเบ™เบ—เบปเปˆเบงเป„เบ›เบ‚เบญเบ‡เบžเบฒเบชเบฒเบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš C.

เบ„เปเบฒเบชเบฑเปˆเบ‡เบญเบทเปˆเบ™เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบŠเบฑเป‰เบ™เบ‚เบญเบ‡เบงเบฑเบ”เบ–เบธเปเบกเปˆเบ™ เบ–เบฒเบ™::เบŠเบฑเป‰เบ™, เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡ vectors, เบเบฑเบšเบ„เบทเบ™เบ›เบฐเป€เบžเบ” vector (เบกเบฑเบ™เปเบ•เบเบ•เปˆเบฒเบ‡เบˆเบฒเบเบŠเบทเปˆเบžเบฒเบเปƒเบ™, เปเบ•เปˆเบเบฑเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบ‚เบปเป‰เบฒเปƒเบˆเบ›เบฐเป€เบžเบ”เบ‚เปเป‰เบกเบนเบ™).

เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ

เบˆเบฒเบ array เบชเบญเบ‡เบกเบดเบ•เบด, เบ—เบตเปˆเป€เบญเบตเป‰เบ™เบเบฑเบ™เบงเปˆเบฒ matrix, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป„เบ›เบซเบฒเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ (?เบ–เบฒเบ™::เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ).

เบฅเบฐโ€‹เบซเบฑเบ”

## lists ------------------

mylist <- as.list(arrmatr)

is.vector(mylist)

is.list(mylist)

เบกเบตเบซเบผเบฒเบเบญเบฑเบ™เป€เบเบตเบ”เบ‚เบถเป‰เบ™เบžเป‰เบญเบกเบเบฑเบ™:

  • เบกเบดเบ•เบดเบ—เบตเบชเบญเบ‡เบ‚เบญเบ‡เบกเบฒเบ•เบฃเบดเบเป€เบšเบทเป‰เบญเบ‡เบžเบฑเบ‡เบฅเบปเบ‡, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ—เบฑเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเปเบฅเบฐ vector เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™.
  • เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป„เบ”เป‰เบฎเบฑเบšเบกเปเบฅเบฐเบ”เบปเบเบˆเบฒเบเบŠเบฑเป‰เบ™เบฎเบฝเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰. เบกเบฑเบ™เบ•เป‰เบญเบ‡เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เปƒเบˆเบงเปˆเบฒเบญเบปเบ‡เบ›เบฐเบเบญเบšเบฅเบฒเบเบเบฒเบ™เบˆเบฐเบเบปเบ‡เบเบฑเบšเบ„เปˆเบฒเบซเบ™เบถเปˆเบ‡ (scalar) เบˆเบฒเบเบ•เบฒเบฅเบฒเบ‡เบ‚เบญเบ‡ array matrix.

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเบเบฑเบ‡เป€เบ›เบฑเบ™ vector, เบšเบฒเบ‡เบซเบ™เป‰เบฒเบ—เบตเปˆ vector เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบเบฑเบšเบกเบฑเบ™.

เบเบญเบšเบ‚เปเป‰เบกเบนเบ™

เบ—เปˆเบฒเบ™โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป„เบ›โ€‹เบˆเบฒเบโ€‹เบšเบฑเบ™โ€‹เบŠเบตโ€‹เบฅเบฒเบโ€‹เบเบฒเบ™โ€‹, เบกเบฒโ€‹เบ•เบฃเบดเบโ€‹เป€เบšเบทเป‰เบญเบ‡โ€‹เบซเบผเบท vector เบเบฑเบš dataframe (?เบ–เบฒเบ™::data.frame).

เบฅเบฐโ€‹เบซเบฑเบ”

## data.frames ------------

df <- as.data.frame(arrmatr)
df2 <- as.data.frame(mylist)

is.list(df)

df$V6 <- df$V1 + df$V2

เบชเบดเปˆเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบเปˆเบฝเบงเบเบฑเบšเบกเบฑเบ™: เบเบญเบšเบ‚เปเป‰เบกเบนเบ™เป„เบ”เป‰เบฎเบฑเบšเบกเปเบฅเบฐเบ”เบปเบเบˆเบฒเบเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ! เบ–เบฑเบ™เบเบญเบšเบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™เบ•เบฒเบฅเบฒเบ‡เบฅเบฒเบเบŠเบทเปˆ. เบ™เบตเป‰เบˆเบฐเบกเบตเบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เปƒเบ™เบžเบฒเบเบซเบฅเบฑเบ‡เป€เบกเบทเปˆเบญเบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™เบ—เบตเปˆเปƒเบŠเป‰เบเบฑเบšเบฅเบฒเบเบเบฒเบ™.

เบ•เบฒเบ•เบฐเบฅเบฒเบ‡

เป€เบญเบปเบฒ DT (?data.table::data.table) เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบˆเบฒเบโ€‹ เบเบญเบšเบ‚เปเป‰เบกเบนเบ™, เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ, vector เบซเบผเบท matrix. เบ•เบปเบงเบขเปˆเบฒเบ‡เป€เบŠเบฑเปˆเบ™เบ™เบตเป‰ (เบขเบนเปˆเปƒเบ™เบชเบฐเบ–เบฒเบ™เบ—เบตเปˆ).

เบฅเบฐโ€‹เบซเบฑเบ”

## data.tables -----------------------
library(data.table)

data.table::setDT(df)

is.list(df)

is.data.frame(df)

is.data.table(df)

เบกเบฑเบ™เป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบ—เบตเปˆ, เป€เบŠเบฑเปˆเบ™เบเบญเบšเบ‚เปเป‰เบกเบนเบ™, DT เบชเบทเบšเบ—เบญเบ”เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ.

DT เปเบฅเบฐเบ„เบงเบฒเบกเบŠเบปเบ‡เบˆเปเบฒ

เบšเปเปˆเป€เบซเบกเบทเบญเบ™เบเบฑเบšเบงเบฑเบ”เบ–เบธเบญเบทเปˆเบ™เป†เบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบ–เบฒเบ™ R, DTs เบ–เบทเบเบชเบปเปˆเบ‡เบœเปˆเบฒเบ™เป‚เบ”เบเบญเป‰เบฒเบ‡เบญเบตเบ‡. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบชเปเบฒเป€เบ™เบปเบฒเบเบฑเบšเบžเบทเป‰เบ™เบ—เบตเปˆเบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเปƒเบซเบกเปˆ, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบŸเบฑเบ‡เบŠเบฑเบ™ data.table::เบชเบณเป€เบ™เบปเบฒ เบซเบผเบทเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบฅเบทเบญเบเบˆเบฒเบเบงเบฑเบ”เบ–เบธเป€เบเบปเปˆเบฒ.

เบฅเบฐโ€‹เบซเบฑเบ”

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, เป€เบŠเบดเปˆเบ‡เบชเปˆเบงเบ™เปƒเบซเบเปˆเปเบกเปˆเบ™เป€เบเบตเบ”เบ‚เบทเป‰เบ™เบเป‰เบญเบ™เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเปเบฅเบฐเบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ—เบตเปˆเบ”เปเบฒเป€เบ™เบตเบ™เบขเบนเปˆเปƒเบ™เบงเบฑเบ”เบ–เบธเบ‚เบญเบ‡เบŠเบฑเป‰เบ™เบ‚เปเป‰เบกเบนเบ™. เปƒเบ™เป€เบงเบฅเบฒเบ”เบฝเบงเบเบฑเบ™, เบเบฒเบ™เบชเบทเบšเบ—เบญเบ”เบˆเบฒเบเบงเบฑเบ”เบ–เบธเบšเบนเบฎเบฒเบ™เบญเบทเปˆเบ™เป†เปเบกเปˆเบ™เบ–เบทเบเบฎเบฑเบเบชเบฒเป„เบงเป‰.

เบšเบฒเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” data.table

เบกเบฑเบเบฅเบฒเบเบเบฒเบ™...

เบเบฒเบ™เบ–เบญเบเปƒเบชเปˆเปเบ–เบงเบ‚เบญเบ‡ dataframe เบซเบผเบท DT เบšเปเปˆเปเบกเปˆเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบ”เบต, เป€เบžเบฒเบฐเบงเปˆเบฒเบฅเบฐเบซเบฑเบ” loop เป€เบ›เบฑเบ™เบžเบฒเบชเบฒ. R เบŠเป‰เบฒเบฅเบปเบ‡เบซเบผเบฒเบ C, เปเบ•เปˆเบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบ—เบตเปˆเบˆเบฐ loop เบœเปˆเบฒเบ™เบ–เบฑเบ™, เป€เบŠเบดเปˆเบ‡เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบกเบตเบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเบเบงเปˆเบฒเบซเบผเบฒเบ. เบœเปˆเบฒเบ™เบ–เบฑเบ™, เบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒเปเบ•เปˆเบฅเบฐเบ–เบฑเบ™เปเบกเปˆเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ‚เบญเบ‡เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ, เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเบกเบต vector. เปเบฅเบฐเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบเปˆเบฝเบงเบเบฑเบš vectors เปเบกเปˆเบ™ vectorized เบ”เบตเปƒเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบžเบฒเบชเบฒ. เบ—เปˆเบฒเบ™เบเบฑเบ‡เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เบ•เบปเบงเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบเบฒเบ™เบ„เบฑเบ”เป€เบฅเบทเบญเบเบ—เบตเปˆเบžเบปเบšเป€เบฅเบทเป‰เบญเบเบเบฑเบšเบฅเบฒเบเบŠเบทเปˆเปเบฅเบฐ vectors: `[[`, `$`.

เบฅเบฐโ€‹เบซเบฑเบ”

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

เบเบฒเบ™เบเบณเบ™เบปเบ” vector

เบ–เป‰เบฒเบกเบตเบ„เบงเบฒเบกเบ•เป‰เบญเบ‡เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบœเปˆเบฒเบ™เป€เบชเบฑเป‰เบ™เบ‚เบญเบ‡ DT เบ‚เบฐเบซเบ™เบฒเบ”เปƒเบซเบเปˆ, เบเบฒเบ™เปเบเป‰เป„เบ‚เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เปเบกเปˆเบ™เบเบฒเบ™เบ‚เบฝเบ™เบซเบ™เป‰เบฒเบ—เบตเปˆเบ”เป‰เบงเบ vectorization. เปเบ•เปˆเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เบงเบฝเบ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบ„เบงเบ™เบˆเบทเปˆเบˆเปเบฒเบงเปˆเบฒเบงเบปเบ‡เบˆเบญเบ™ เบžเบฒเบเปƒเบ™ DT เบเบฑเบ‡เป„เบงเบเบงเปˆเบฒเบฎเบญเบšเบงเบฝเบ™ R, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เบชเบธเบ” C.

เบกเบฒเบฅเบญเบ‡เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ—เบตเปˆเปƒเบซเบเปˆเบเบงเปˆเบฒเบ”เป‰เบงเบเปเบ–เบง 100K. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบชเบฐเบเบฑเบ”เบ•เบปเบงเบญเบฑเบเบชเบญเบ™เบ—เปเบฒเบญเบดเบ”เบˆเบฒเบเบ„เปเบฒเบ—เบตเปˆเบขเบนเปˆเปƒเบ™เบ–เบฑเบ™ vector 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))
		]
})

เบ—เปเบฒเบญเบดเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ iterating เปƒเบ™เป„เบฅเบเบฐเปเบ–เบง:

เบซเบปเบงเปœเปˆเบงเบ: milliseconds
expr min
{ dt[, `:=`(first_l, unlist(strsplit(w, split = " ", fixed = T))[1]), เป‚เบ”เบ = 1:nrow(dt)] } 439.6217
lq เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบ›เบฒเบ™เบเบฒเบ‡ uq max neval
+451.9998 460.1593 456.2505 460.9147 621.4042 100

เป„เบฅเบเบฐเบ—เบตเบชเบญเบ‡, เบšเปˆเบญเบ™เบ—เบตเปˆ vectorization เป€เบเบตเบ”เบ‚เบถเป‰เบ™เป‚เบ”เบเบเบฒเบ™เบซเบฑเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ matrix เปเบฅเบฐเป€เบญเบปเบฒเบญเบปเบ‡เบ›เบฐเบเบญเบšเปƒเบ™ slice เบเบฑเบšเบ”เบฑเบ”เบŠเบฐเบ™เบต 1 (เบญเบฑเบ™เบชเบธเบ”เบ—เป‰เบฒเบเปเบกเปˆเบ™ vectorization เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡). เบเบฒเบ™เปเบเป‰เป„เบ‚: vectorization เปƒเบ™เบฅเบฐเบ”เบฑเบšเบซเบ™เป‰เบฒเบ—เบตเปˆ strsplit, เป€เบŠเบดเปˆเบ‡เบชเบฒเบกเบฒเบ”เบเบญเบกเบฎเบฑเบš vector เป€เบ›เบฑเบ™ input. เบกเบฑเบ™เบ›เบฐเบเบปเบ”เบงเปˆเบฒเบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เบ›เปˆเบฝเบ™เบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ matrix เปเบกเปˆเบ™เบกเบตเบ„เบงเบฒเบกเบซเบเบธเป‰เบ‡เบเบฒเบเบซเบผเบฒเบเบเปˆเบงเบฒ vectorization เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡, เปเบ•เปˆเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ™เบตเป‰เบกเบฑเบ™เบˆเบฐเป„เบงเบเบงเปˆเบฒเบชเบฐเบšเบฑเบšเบ—เบตเปˆเบšเปเปˆเปเบกเปˆเบ™ vectorized.

เบซเบปเบงเปœเปˆเบงเบ: milliseconds
expr min lq เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ 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 เบ„เบฑเป‰เบ‡.

เป„เบฅเบเบฐเบ—เบตเบชเบฒเบก, เบšเปˆเบญเบ™เบ—เบตเปˆเป‚เบ„เบ‡เบเบฒเบ™เบเบฒเบ™เบซเบฑเบ™เป€เบ›เบฑเบ™ matrix เป„เบ”เป‰เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡.

เบซเบปเบงเปœเปˆเบงเบ: milliseconds
expr min lq เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒ 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 เบ„เบฑเป‰เบ‡.

เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบ—เบปเบ”เบฅเบญเบ‡เบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰, เบซเบผเบฒเบ, เบกเบฑเบ™เบˆเบฐเบ”เบตเบเบงเปˆเบฒ.

เบ•เบปเบงเบขเปˆเบฒเบ‡เบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบกเบต vectorization, เบšเปˆเบญเบ™เบ—เบตเปˆเบกเบตเบ‚เปเป‰เบ„เบงเบฒเบก, เปเบ•เปˆเบงเปˆเบฒเบกเบฑเบ™เปเบกเปˆเบ™เปƒเบเป‰เบŠเบดเบ”เบเบฑเบšเป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡: เบ„เบงเบฒเบกเบเบฒเบงเบ‚เบญเบ‡เบ„เปเบฒเบชเบฑเบšเบ•เปˆเบฒเบ‡เป†, เบˆเปเบฒเบ™เบงเบ™เบ„เปเบฒเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™. เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบš 3 เบ„เปเบฒเบ—เปเบฒเบญเบดเบ”. เปเบšเบšเบ™เบตเป‰:

เบ›เบฐเบกเบฒเบ™ data.table

เบ—เบตเปˆเบ™เบตเป‰เบซเบ™เป‰เบฒเบ—เบตเปˆเบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒเบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เบงเบฝเบ, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒ vectors เบกเบตเบ„เบงเบฒเบกเบเบฒเบงเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ”เบ‚เบฐเบซเบ™เบฒเบ” matrix. เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบฎเบฑเบ”เบ„เบทเบ™เบ™เบตเป‰เป‚เบ”เบเบเบฒเบ™เบ‚เบธเบ”เบฅเบปเบ‡เปƒเบ™เบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”.

เบฅเบฐโ€‹เบซเบฑเบ”

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

เบซเบปเบงเปœเปˆเบงเบ: milliseconds
expr min lq เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบ›เบฒเบ™เบเบฒเบ‡

{ dt[, `:=`((paste0(โ€œw_โ€, 1:3)), strsplit(w, เปเบเบ = " ", fixed = T))] } 851.7623 916.071 1054.5 1035.199
uq max neval
+1178.738 1356.816 100

เบชเบฐเบ„เบฃเบดเบšเปเบฅเปˆเบ™เบ”เป‰เบงเบเบ„เบงเบฒเบกเป„เบงเบชเบฐเป€เบฅเปˆเบ 1 เบงเบดเบ™เบฒเบ—เบต. เบšเปเปˆเบ”เบต.

เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป‚เบ”เบเบ•เปˆเบญเบ‡เป‚เบชเป‰เบ”เบฝเบง ...

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบงเบฑเบ”เบ–เบธ DT เป‚เบ”เบเปƒเบŠเป‰เบฅเบฐเบšเบปเบšเบ•เปˆเบญเบ‡เป‚เบชเป‰. เบกเบฑเบ™เบ„เป‰เบฒเบเบ„เบทเบเบฒเบ™เบ•เบดเบ” syntax เบงเบปเบ‡เป€เบฅเบฑเบšเป„เบ›เบ—เบฒเบ‡เบ‚เบงเบฒ, เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เปเบกเปˆเบ™เป‰เปเบฒเบ•เบฒเบ™.

เบฅเบฐโ€‹เบซเบฑเบ”

# 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. เปƒเบซเป‰เป€เบญเบปเบฒเบ„เปˆเบฒเบชเปเบฒเบ›เบฐเบชเบดเบ”เบเบฒเบ™เบ–เบปเบ”เบ–เบญเบเบ‚เบญเบ‡ logistic เบชเปเบฒเบฅเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบชเบฑเบ‡เป€เบ„เบฒเบฐเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ”เป‰เบงเบเบ•เบปเบงเบเบญเบ‡เบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™ 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

เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ™เปเบฒเปƒเบŠเป‰เบŸเบฑเบ‡เบŠเบฑเบ™ lambda, เปเบ•เปˆเบšเบฒเบ‡เบ„เบฑเป‰เบ‡เบกเบฑเบ™เบเปเปˆเบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบชเป‰เบฒเบ‡เบžเบงเบเบกเบฑเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ, เบ‚เบฝเบ™เบ—เปเปˆเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”, เปเบฅเบฐเบชเบทเบšเบ•เปเปˆเป€เบ”เบตเบ™เบซเบ™เป‰เบฒ - เบžเบงเบเป€เบ‚เบปเบฒเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™ DT. เบ•เบปเบงเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบญเบธเบ”เบปเบกเบชเบปเบกเบšเบนเบ™เบ”เป‰เบงเบเบฅเบฑเบเบชเบฐเบ™เบฐเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ—เบฑเบ‡เบซเบกเบปเบ”, เบšเบงเบเบเบฑเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบซเบผเบฒเบเบขเปˆเบฒเบ‡เบˆเบฒเบ DT arsenal (เป€เบŠเบฑเปˆเบ™: เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ 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. . เบ‚เป‰เบฒโ€‹เบžเบฐโ€‹เป€เบˆเบปเป‰เบฒโ€‹เบซเบงเบฑเบ‡โ€‹เบงเปˆเบฒโ€‹เบ™เบตเป‰โ€‹เบˆเบฐโ€‹เบŠเปˆเบงเบโ€‹เปƒเบซเป‰โ€‹เบ—เปˆเบฒเบ™โ€‹เป„เบ”เป‰โ€‹เบ”เบตเบโ€‹เบงเปˆเบฒโ€‹เบฎเบฝเบ™โ€‹เบฎเบนเป‰โ€‹เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เบ™เปเบฒโ€‹เปƒเบŠเป‰โ€‹เบซเป‰เบญเบ‡โ€‹เบชเบฐโ€‹เบซเบกเบธเบ”โ€‹เบ™เบตเป‰โ€‹เบชเปเบฒโ€‹เบฅเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบฎเบฑเบ”โ€‹เบงเบฝเบโ€‹เปเบฅเบฐ เบšเบฑเบ™เป€เบ—เบตเบ‡.

เบ›เบฐเบกเบฒเบ™ data.table

!

เบฅเบฐเบซเบฑเบ”เป€เบ•เบฑเบก

เบฅเบฐโ€‹เบซเบฑเบ”

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

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™