เบเบฑเบเบเบถเบเบเบตเปเบเบฐเบกเบตเบเบงเบฒเบกเบชเบปเบเปเบเบเบฑเบเบเบนเปเบเบตเปเปเบเปเบซเปเบญเบเบชเบฐเบซเบกเบธเบเบเบฒเบเบเบธเบเปเบเปเบเบเปเปเบกเบนเบเบเบฒเบเบฐเบฅเบฒเบเบชเปเบฒเบฅเบฑเบ 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 เบเปเบฒเบเปเบฒเบญเบดเบ. เปเบเบเบเบตเป:

เบเบตเปเบเบตเปเบซเบเปเบฒเบเบตเปเบเบตเปเบเปเบฒเบเบกเบฒเบเปเปเปเบเปเปเบฎเบฑเบเบงเบฝเบ, เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒ 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. . เบเปเบฒโเบเบฐโเปเบเบปเปเบฒโเบซเบงเบฑเบโเบงเปเบฒโเบเบตเปโเบเบฐโเบเปเบงเบโเปเบซเปโเบเปเบฒเบโเปเบเปโเบเบตเบโเบงเปเบฒโเบฎเบฝเบโเบฎเบนเปโเปเบฅเบฐโเบเบฒเบโเบเปเบฒโเปเบเปโเบซเปเบญเบโเบชเบฐโเบซเบกเบธเบโเบเบตเปโเบชเปเบฒโเบฅเบฑเบโเบเบฒเบโเปเบฎเบฑเบโเบงเบฝเบโเปเบฅเบฐ เบเบฑเบเปเบเบตเบ.

!
เบฅเบฐเบซเบฑเบเปเบเบฑเบก
เบฅเบฐโเบซเบฑเบ
## 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
