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)

เจ…เจœเจฟเจนเฉ€ เจ‡เฉฑเจ• เจฌเจฃเจคเจฐ เจ‡เฉฑเจ• เจเจฐเฉ‡ เจนเฉˆ (?เจฌเฉ‡เจธ::เจเจฐเฉ‡). เจนเฉ‹เจฐ เจญเจพเจธเจผเจพเจตเจพเจ‚ เจตเจพเจ‚เจ—, เจ‡เฉฑเจฅเฉ‡ เจเจฐเฉ‡ เจฌเจนเฉ-เจ†เจฏเจพเจฎเฉ€ เจนเจจเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจฆเจฟเจฒเจšเจธเจช เจ—เฉฑเจฒ เจ‡เจน เจนเฉˆ เจ•เจฟ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เฉฑเจ• เจฆเฉ‹-เจ…เจฏเจพเจฎเฉ€ เจเจฐเฉ‡ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจ•เจฒเจพเจธ เจคเฉ‹เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเจพ เจนเฉˆ (? เจ…เจงเจพเจฐ::เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ), เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ‡เฉฑเจ•-เจ…เจฏเจพเจฎเฉ€ เจเจฐเฉ‡, เจœเฉ‹ เจ•เจฟ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจตเฉ€ เจนเฉˆ, เจ‡เฉฑเจ• เจตเฉˆเจ•เจŸเจฐ เจคเฉ‹เจ‚ เจชเฉเจฐเจพเจชเจค เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเจพ (?เจฌเฉ‡เจธ::เจตเฉˆเจ•เจŸเจฐ).

เจ‡เจน เจธเจฎเจเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจ•เจฟ เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจตเจธเจคเฉ‚ เจตเจฟเฉฑเจš เจฎเฉŒเจœเฉ‚เจฆ เจกเฉ‡เจŸเจพ เจฆเฉ€ เจ•เจฟเจธเจฎ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เฉ€เจคเฉ€ เจœเจพเจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจนเฉˆ เจ…เจงเจพเจฐ::เจ•เจฟเจธเจฎ, เจœเฉ‹ เจ•เจฟ เจ…เจจเฉเจธเจพเจฐ เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ เจ•เจฟเจธเจฎ เจฆเจพ เจตเจฐเจฃเจจ เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆ เจ†เจฐ เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ - เจฎเฉ‚เจฒ เจจเจพเจฒ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจญเจพเจธเจผเจพ เจฆเจพ เจ†เจฎ เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ C.

เจ•เจฟเจธเฉ‡ เจตเจธเจคเฉ‚ เจฆเฉ€ เจธเจผเฉเจฐเฉ‡เจฃเฉ€ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจ•เจฎเจพเจ‚เจก เจนเฉˆ เจ…เจงเจพเจฐ::เจ•เจฒเจพเจธ, เจตเฉˆเจ•เจŸเจฐเจพเจ‚ เจฆเฉ‡ เจฎเจพเจฎเจฒเฉ‡ เจตเจฟเฉฑเจš, เจตเฉˆเจ•เจŸเจฐ เจ•เจฟเจธเจฎ เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆ (เจ‡เจน เจ…เฉฐเจฆเจฐเฉ‚เจจเฉ€ เจจเจพเจฎ เจคเฉ‹เจ‚ เจตเฉฑเจ–เจฐเจพ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจชเจฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจกเฉ‡เจŸเจพ เจ•เจฟเจธเจฎ เจจเฉ‚เฉฐ เจธเจฎเจเจฃ เจฆเฉ€ เจตเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ)เฅค

เจฆเฉ€ เจธเฉ‚เจšเฉ€

เจ‡เฉฑเจ• เจฆเฉ‹-เจ…เจฏเจพเจฎเฉ€ เจเจฐเฉ‡ เจคเฉ‹เจ‚, เจœเจฟเจธเจจเฉ‚เฉฐ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจตเฉ€ เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจคเฉเจธเฉ€เจ‚ เจธเฉ‚เจšเฉ€ เจตเจฟเฉฑเจš เจœเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹ (?เจฌเฉ‡เจธ::เจธเฉ‚เจšเฉ€).

เจ•เฉ‹เจก

## 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.tables -----------------------
library(data.table)

data.table::setDT(df)

is.list(df)

is.data.frame(df)

is.data.table(df)

เจ‡เจน เจฒเจพเจญเจฆเจพเจ‡เจ• เจนเฉˆ เจ•เจฟ, เจ‡เฉฑเจ• เจกเฉ‡เจŸเจพเจซเฉเจฐเฉ‡เจฎ เจตเจพเจ‚เจ—, เจ‡เฉฑเจ• DT เจ‡เฉฑเจ• เจธเฉ‚เจšเฉ€ เจฆเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจกเฉ€เจŸเฉ€ เจ…เจคเฉ‡ เจฎเฉˆเจฎเฉ‹เจฐเฉ€

R เจฌเฉ‡เจธ เจตเจฟเฉฑเจš เจนเฉ‹เจฐ เจธเจพเจฐเฉ€เจ†เจ‚ เจตเจธเจคเฉ‚เจ†เจ‚ เจฆเฉ‡ เจ‰เจฒเจŸ, DTs เจนเจตเจพเจฒเฉ‡ เจฆเฉเจ†เจฐเจพ เจชเจพเจธ เจ•เฉ€เจคเฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจจเจตเฉ‡เจ‚ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจ–เฉ‡เจคเจฐ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ•เจพเจชเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจซเฉฐเจ•เจธเจผเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ 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)

เจ‡เจน เจœเจพเจฃ-เจชเจ›เจพเจฃ เจธเจฎเจพเจชเจค เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจกเฉ€เจŸเฉ€ เจ†เจฐ เจตเจฟเฉฑเจš เจกเฉ‡เจŸเจพ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ‡ เจตเจฟเจ•เจพเจธ เจฆเฉ€ เจ‡เฉฑเจ• เจจเจฟเจฐเฉฐเจคเจฐเจคเจพ เจนเฉˆ, เจœเฉ‹ เจฎเฉเฉฑเจ– เจคเฉŒเจฐ 'เจคเฉ‡ เจกเฉ‡เจŸเจพเจซเฉเจฐเฉ‡เจฎ เจ•เจฒเจพเจธ เจฆเฉ€เจ†เจ‚ เจตเจธเจคเฉ‚เจ†เจ‚ 'เจคเฉ‡ เจ•เฉ€เจคเฉ‡ เจ—เจ เจ•เจพเจฐเจœเจพเจ‚ เจฆเฉ‡ เจตเจฟเจธเจฅเจพเจฐ เจ…เจคเฉ‡ เจชเฉเจฐเจตเฉ‡เจ— เจฆเฉ‡ เจ•เจพเจฐเจจ เจตเจพเจชเจฐเจฆเจพ เจนเฉˆเฅค เจ‰เจธเฉ‡ เจธเจฎเฉ‡เจ‚, เจนเฉ‹เจฐ เจ†เจฆเจฟเจฎ เจคเฉ‹เจ‚ เจตเจฟเจฐเจพเจธเจค เจจเฉ‚เฉฐ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจฐเฉฑเจ–เจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ.

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.

เจšเจฒเฉ‹ เจ‡เจธเจจเฉ‚เฉฐ 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))
		]
})

เจชเจนเจฟเจฒเจพเจ‚ เจ•เจคเจพเจฐเจพเจ‚ เจ‰เฉฑเจคเฉ‡ เจฆเฉเจนเจฐเจพเจ“ เจšเจฒเจพเจ“:

เจฏเฉ‚เจจเจฟเจŸ: เจฎเจฟเจฒเฉ€เจธเจ•เจฟเฉฐเจŸ
expr เจฎเจฟเฉฐเจŸ
{ dt[, `:=`(first_l, unlist(strsplit(w, split = " ", fixed = T))[1]), by = 1:nrow(dt)] } 439.6217
lq เจฆเจพ เจฎเจคเจฒเจฌ เจฎเฉฑเจงเจฎ uq เจ…เจงเจฟเจ•เจคเจฎ เจจเฉ‡เจตเจฒ เจนเฉˆ
451.9998 460.1593 456.2505 460.9147 621.4042 100

เจฆเฉ‚เจœเฉ€ เจฐเจจ, เจœเจฟเฉฑเจฅเฉ‡ เจธเฉ‚เจšเฉ€ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจตเจฟเฉฑเจš เจฌเจฆเจฒ เจ•เฉ‡ เจ…เจคเฉ‡ เจธเฉ‚เจšเจ•เจพเจ‚เจ• 1 เจฆเฉ‡ เจจเจพเจฒ เจŸเฉเจ•เฉœเฉ‡ 'เจคเฉ‡ เจคเฉฑเจค เจฒเฉˆ เจ•เฉ‡ เจตเฉˆเจ•เจŸเจฐเจพเจˆเจœเจผเฉ‡เจธเจผเจจ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ (เจฌเจพเจ…เจฆ เจตเจฟเฉฑเจš เจตเฉˆเจ•เจŸเจฐเจพเจˆเจœเจผเฉ‡เจธเจผเจจ เจ†เจชเจฃเฉ‡ เจ†เจช เจนเฉˆ)เฅค เจธเฉเจงเจพเจฐ: เจซเฉฐเจ•เจธเจผเจจ เจชเฉฑเจงเจฐ 'เจคเฉ‡ เจตเฉˆเจ•เจŸเจฐเจพเจˆเจœเจผเฉ‡เจธเจผเจจ strsplit, เจœเฉ‹ เจ‡เฉฑเจ• เจตเฉˆเจ•เจŸเจฐ เจจเฉ‚เฉฐ เจ‡เจจเจชเฉเจŸ เจตเจœเฉ‹เจ‚ เจธเจตเฉ€เจ•เจพเจฐ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ‡เจน เจชเจคเจพ เจšเจฒเจฆเจพ เจนเฉˆ เจ•เจฟ เจธเฉ‚เจšเฉ€ เจจเฉ‚เฉฐ เจฎเฉˆเจŸเฉเจฐเจฟเจ•เจธ เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฃ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ†เจชเจฃเฉ‡ เจ†เจช เจตเจฟเฉฑเจš เจตเฉˆเจ•เจŸเจฐเจพเจˆเจœเจผเฉ‡เจธเจผเจจ เจจเจพเจฒเฉ‹เจ‚ เจฌเจนเฉเจค เจœเจผเจฟเจ†เจฆเจพ เจฎเฉเจธเจผเจ•เจฒ เจนเฉˆ, เจชเจฐ เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš เจ‡เจน เจ—เฉˆเจฐ-เจตเฉˆเจ•เจŸเฉ‹เจฐเจพเจˆเจœเจผเจก เจธเฉฐเจธเจ•เจฐเจฃ เจจเจพเจฒเฉ‹เจ‚ เจฌเจนเฉเจค เจคเฉ‡เจœเจผ เจนเฉˆเฅค

เจฏเฉ‚เจจเจฟเจŸ: เจฎเจฟเจฒเฉ€เจธเจ•เจฟเฉฐเจŸ
expr min lq เจฎเจคเจฒเจฌ เจฎเฉฑเจงเจฎ uq เจ…เจงเจฟเจ•เจคเจฎ เจจเฉ‡เจตเจฒ
{ 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 เจ…เจงเจฟเจ•เจคเจฎ เจจเฉ‡เจตเจฒ
{ dt[, `:=`(first_l, .(first_l_f2(w))] } 32.60481 34.13679 40.4544 35.57115 42.11975 222.972 100

เจตเจฟเฉฑเจš เจฎเฉฑเจงเจฎ เจฆเฉเจ†เจฐเจพ เจชเฉเจฐเจตเฉ‡เจ— 13 เจตเจพเจฐ.

เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจธ เจฎเจพเจฎเจฒเฉ‡ เจจเจพเจฒ เจชเฉเจฐเจฏเฉ‹เจ— เจ•เจฐเจจ เจฆเฉ€ เจœเจผเจฐเฉ‚เจฐเจค เจนเฉˆ, เจœเจฟเฉฐเจจเจพ เจœเจผเจฟเจ†เจฆเจพ, เจ‡เจน เจฌเจฟเจนเจคเจฐ เจนเฉ‹เจตเฉ‡เจ—เจพ.

เจตเฉˆเจ•เจŸเจฐเจพเจˆเจœเจผเฉ‡เจธเจผเจจ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจ‰เจฆเจพเจนเจฐเจจ, เจœเจฟเฉฑเจฅเฉ‡ เจŸเฉˆเจ•เจธเจŸ เจตเฉ€ เจนเฉˆ, เจชเจฐ เจ‡เจน เจ…เจธเจฒ เจธเจฅเจฟเจคเฉ€เจ†เจ‚ เจฆเฉ‡ เจจเฉ‡เฉœเฉ‡ เจนเฉˆ: เจธเจผเจฌเจฆเจพเจ‚ เจฆเฉ€ เจตเฉฑเจ–-เจตเฉฑเจ– เจฒเฉฐเจฌเจพเจˆ, เจธเจผเจฌเจฆเจพเจ‚ เจฆเฉ€ เจตเฉฑเจ–เจฐเฉ€ เจธเฉฐเจ–เจฟเจ†เฅค เจคเฉเจนเจพเจจเฉ‚เฉฐ เจชเจนเจฟเจฒเฉ‡ 3 เจธเจผเจฌเจฆ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚:

data.table เจฆเฉ‡ เจ†เจฒเฉ‡-เจฆเฉเจ†เจฒเฉ‡

เจ‡เฉฑเจฅเฉ‡ เจชเจฟเจ›เจฒเจพ เจซเฉฐเจ•เจธเจผเจจ เจ•เฉฐเจฎ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจตเฉˆเจ•เจŸเจฐ เจตเฉฑเจ–-เจตเฉฑเจ– เจฒเฉฐเจฌเจพเจˆ เจฆเฉ‡ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจฎเฉˆเจŸเจฐเจฟเจ•เจธ เจฆเจพ เจ†เจ•เจพเจฐ เจธเฉˆเฉฑเจŸ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจ†เจ“ เจ‡เฉฐเจŸเจฐเจจเฉˆเฉฑเจŸ 'เจคเฉ‡ เจ†เจฒเฉ‡-เจฆเฉเจ†เจฒเฉ‡ เจ–เฉ‹เจฆเจฃ เจฆเฉเจ†เจฐเจพ เจ‡เจธเจจเฉ‚เฉฐ เจฆเฉเจฌเจพเจฐเจพ เจ•เจฐเฉ€เจเฅค

เจ•เฉ‹เจก

# 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[, `:=`((เจชเฉ‡เจธเจŸ0(โ€œw_โ€, 1:3)), strsplit(w, split = "", fixed = T))] } 851.7623 916.071 1054.5 1035.199
uq เจ…เจงเจฟเจ•เจคเจฎ เจจเฉ‡เจตเจฒ
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)]

เจชเจพเจˆเจชเจพเจ‚ เจฐเจพเจนเฉ€เจ‚ เจตเจนเจฟเจฃเจพ ...

เจ‰เจนเฉ€ เจ“เจชเจฐเฉ‡เจธเจผเจจ เจชเจพเจˆเจชเจฟเฉฐเจ— เจฆเฉเจ†เจฐเจพ เจ•เฉ€เจคเฉ‡ เจœเจพ เจธเจ•เจฆเฉ‡ เจนเจจ, เจ‡เจน เจธเจฎเจพเจจ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจชเจฐ เจ•เจพเจฐเจœเจธเจผเฉ€เจฒ เจคเฉŒเจฐ 'เจคเฉ‡ เจตเจงเฉ‡เจฐเฉ‡ เจ…เจฎเฉ€เจฐ เจนเฉˆ, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจขเฉฐเจ— เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจจเจพ เจ•เจฟ เจธเจฟเจฐเจซเจผ เจกเฉ€เจŸเฉ€. เจ†เจ“ 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 เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ…เฉฐเจ•เฉœเฉ‡, เจฎเจธเจผเฉ€เจจ เจธเจฟเจ–เจฒเจพเจˆ เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจฌเจนเฉเจค เจ•เฉเจ

เจคเฉเจธเฉ€เจ‚ เจฒเฉˆเจ‚เจฌเจกเจพ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจชเจฐ เจ•เจˆ เจตเจพเจฐ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจตเฉฑเจ–เจฐเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจฌเจฃเจพเจ‰เจฃเจพ เจฌเจฟเจนเจคเจฐ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจชเฉ‚เจฐเฉ‡ เจกเฉ‡เจŸเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจจเฉ‚เฉฐ เจฒเจฟเจ–เฉ‹, เจ…เจคเฉ‡ เจ…เฉฑเจ—เฉ‡ เจตเจงเฉ‹ - เจ‰เจน เจกเฉ€เจŸเฉ€ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค เจ‰เจฆเจพเจนเจฐเจจ เจ‰เจชเจฐเฉ‹เจ•เจค เจธเจพเจฐเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจจเจพเจฒ เจญเจฐเจชเฉ‚เจฐ เจนเฉˆ, เจจเจพเจฒ เจนเฉ€ เจกเฉ€เจŸเฉ€ เจ†เจฐเจธเจจเจฒ เจฆเฉ€เจ†เจ‚ เจ•เจˆ เจ‰เจชเจฏเฉ‹เจ—เฉ€ เจšเฉ€เจœเจผเจพเจ‚ (เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‡เฉฑเจ• เจฒเจฟเฉฐเจ• เจฐเจพเจนเฉ€เจ‚ เจกเฉ€เจŸเฉ€ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจกเฉ€เจŸเฉ€ เจจเฉ‚เฉฐ เจเจ•เจธเฉˆเจธ เจ•เจฐเจจเจพ, เจ•เจˆ เจตเจพเจฐ เจ•เฉเจฐเจฎเจตเจพเจฐ เจจเจนเฉ€เจ‚, เจชเจฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจธเจผเจพเจฎเจฒ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ)เฅค

เจ•เฉ‹เจก

# 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 เจตเจฐเจ—เฉ€ เจ‡เฉฑเจ• เจตเจธเจคเฉ‚ เจฆเฉ€ เจคเจธเจตเฉ€เจฐ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ‡ เจฏเฉ‹เจ— เจธเฉ€, เจ†เจฐ เจ•เจฒเจพเจธเจพเจ‚ เจคเฉ‹เจ‚ เจตเจฟเจฐเจพเจธเจค เจจเจพเจฒ เจœเฉเฉœเฉ€เจ†เจ‚ เจ‡เจธเจฆเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจคเฉ‹เจ‚ เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจ‡เจธ เจฆเฉ€เจ†เจ‚ เจ†เจชเจฃเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจ…เจคเฉ‡ เจตเจพเจคเจพเจตเจฐเจฃ เจฆเฉ‡ เจจเจพเจฒ เจ–เจคเจฎ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค . เจฎเฉˆเจจเฉ‚เฉฐ เจ‰เจฎเฉ€เจฆ เจนเฉˆ เจ•เจฟ เจ‡เจน เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เจธ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจจเฉ‚เฉฐ เจ•เฉฐเจฎ เจฒเจˆ เจฌเจฟเจนเจคเจฐ เจขเฉฐเจ— เจจเจพเจฒ เจธเจฟเฉฑเจ–เจฃ เจ…เจคเฉ‡ เจตเจฐเจคเจฃ เจตเจฟเฉฑเจš เจฎเจฆเจฆ เจ•เจฐเฉ‡เจ—เจพ เจฎเจจเฉ‹เจฐเฉฐเจœเจจ.

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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹