á€ááá¯á·á áºááẠR table data processing library data.table ááᯠá¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡ááœáẠá áááºáááºá á¬ážááœááºááŒá áºááŒá®áž á¥ááá¬á¡áá»áá¯ážáá»áá¯ážááŒáá·áº áááºážáá¡áá¯á¶ážáá»ááá®áá±ážááŸááºážá ááŒá±á¬ááºážááœááºááŒááºááœááºááᯠááŒááºááœá±á·áááá·áºá¡ááœáẠáá»á±áááºáááá±áááºá
á
á¶ááá°áá¬áá±á¬ááºážáá
áºáá¯á á
áááºá¡á¬ážáááºáááºáááºá áá°á·áá±á¬ááºážáá«ážááᯠáááºáááºááŒá®ážááŒá®áᯠáá»áŸá±á¬áºááá·áºáá»ááºá code optimization ááŸáá·áº performance ááá¯á¡ááŒá±áá¶á ááá¯ááá¯áááºááŸáá¯ááºážá
áœá¬ áá°ážáá±á¬áºááẠá¡ááŒá¶ááŒá¯áá«áááºá áá±áá¬.
áááá«ááºáž- data.table áááºááá¬áá¬áá²á
ááŒá±á¬áááẠdata.table object (áá±á¬ááºáá±á¬ááºá DT) ááᯠááá°ááá¯ááºáá²á· data structures ááœá±áá²á· áááºážáááºážáá±ážáá±ážá á á¬ááŒáá·áºááá¯ááºáá²á· á áááºáááºážááŸá®ážáᬠá¡áá±á¬ááºážáá¯á¶ážáá«áá²á
Array
áá¯ááº
## arrays ---------
arrmatr <- array(1:20, c(4,5))
class(arrmatr)
typeof(arrmatr)
is.array(arrmatr)
is.matrix(arrmatr)
ááá¯áá²á·ááá¯á·áá±á¬ááœá²á·á ááºážáá¯á¶áá»á¬ážáá²ááŸáá áºáá¯ááẠarray áá áºáá¯ááŒá áºááẠ(?base::array) á¡ááŒá¬ážáá¬áá¬á áá¬ážáá»á¬ážáá²á·ááá¯á·áááºá á€áá±áá¬ááœáẠarray áá»á¬ážááẠáááºáá±á«ááºážá á¯á¶ááŸááááºá ááá¯á·áá±á¬áº á áááºáááºá á¬ážá áá¬áá±á¬ááºážáááºááŸá¬ á¥ááá¬á¡á¬ážááŒáá·áºá ááŸá áºáááºááŒáẠarray ááẠmatrix class á០áá¯ááºááá¹áááá»á¬ážááᯠá¡ááœá±áááºáá¶áá¬áá«áááºá (?base::matrix) ááŸáá·áº á¡áá±ážááŒá®ážáá±á¬á¡áá»ááºááŸá¬ áá áºáááºááŒáẠarray ááẠvector áá áºáá¯á០á¡ááœá±áááºáá¶ááŒááºáž áááŸááá« (?base::vector).
áááºááá·áºá¡áá¬ááá¹áá¯ááœááºáá«ááŸááá±á¬áá±áá¬á¡áá»áá¯ážá¡á á¬ážááᯠfunction ááŸá á áºáá±ážááá·áºáááºááá¯áá¬ážáááºáááºá¡áá±ážááŒá®ážáá«áááºá á¡ááŒá±áá¶::á¡áá»áá¯ážá¡á á¬ážá¡áá»áá¯ážá¡á á¬ážá¡ááá¯áẠá¡ááœááºážááá¯ááºážáá±á¬áºááŒáá»ááºááᯠááŒááºáá±ážáááºá R á¡ááœááºážááá¯ááºáž â áá°áááºážááŸáá·áº áááºá ááºáá±áá±á¬ áá¯á¶áá¬áá¬á áá¬áž áááá¯ááá¯áá±á¬ C.
á¡ááŒá¬ážá¡áá¬ááá¹áá¯áá áºáá¯á class ááá¯áá¯á¶ážááŒááºááẠcommand á á¡ááŒá±áá¶::á¡áááºážVector áá»á¬ážááœááºá vector á¡áá»áá¯ážá¡á á¬ážááᯠááŒááºáá±ážááẠ(áááºážááœáẠá¡ááœááºážááá¯ááºážá¡áááºááŸáá·áº ááœá²ááŒá¬ážáá±á¬áºáááºáž áá±áá¬á¡áá»áá¯ážá¡á á¬ážááᯠáá¬ážáááºááá¯ááºáááº)á
á á¬áááºáž
áááºááá áºáá¯áááºáž áá±á«áºáá±á¬ ááŸá áºáááºááŒáẠáááºážáá»ááºážááŸá á á¬áááºážáá áºáá¯ááá¯á· áááºááœá¬ážááá¯ááºáááºá?base::á á¬áááºáž).
áá¯ááº
## lists ------------------
mylist <- as.list(arrmatr)
is.vector(mylist)
is.list(mylist)
áá áºáá»áááºáááºážááœáẠá¡áá¬áá»á¬ážá áœá¬ ááŒá áºáá±á«áºáá¬áááº-
- áááºááá áºá áá¯áááá¡ááá¯ááºážá¡áᬠááŒáá¯áá»áááºá ááá¯ááá¯áááºááŸá¬á áá»áœááºá¯ááºááá¯á·ááẠá á¬áááºážáá áºáá¯ááŸáá·áº vector áá áºáá¯ááá¯á·ááᯠáá áºááŒáá¯ááºáááºáááºáž áááŸááááºá
- ááá¯á·ááŒá±á¬áá·áº á€á¡áááºážáá»á¬ážá០á¡ááœá±áááºáá¶áá±á¬á á¬áááºážá á á¬áááºážááŒááºá ááºáá áºáá¯á á®ááẠmatrix array ááá²ááºáá áºáá¯á០(scalar) áááºááá¯ážáá áºáá¯ááŸáá·áº áááºááá¯ááºááŒá±á¬ááºáž ááŸááºáá¬ážáá¬ážáá«á
á á¬áááºážáá áºáá¯ááẠvector áá áºáá¯ááŒá áºáá±á¬ááŒá±á¬áá·áºá á¡áá»áá¯á·áá±á¬ vector functions áá»á¬ážááᯠáááºážááœááºá¡áá¯á¶ážáá»ááá¯ááºáááºá
áá±áá¬áá±á¬ááº
á á¬áááºážáá áºáá¯á matrix ááá¯á·ááá¯áẠvector á០data frame ááá¯á·áááºááœá¬ážááá¯ááºáááºá?base::data.frame).
áá¯ááº
## data.frames ------------
df <- as.data.frame(arrmatr)
df2 <- as.data.frame(mylist)
is.list(df)
df$V6 <- df$V1 + df$V2
á áááºáááºá á¬ážá áá¬áá±á¬ááºážáá¬á dataframe áᬠá á¬áááºážáá áºáá¯ááá± á¡ááœá±áááºáá¶ááá¬áá²á áá±áá¬áá±á¬ááºá áá±á¬áºáá¶áá»á¬ážááẠá á¬áááºážááá²ááºáá»á¬ážááŒá áºáááºá á á¬áááºážáá»á¬ážááŸáá·áº áááºááá¯ááºáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá·áºá¡áá« áááºážááẠáá±á¬ááºááá¯ááºážááœáẠá¡áá±ážááŒá®ážáá«áááºá
áá±áá¬
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)
á¡áá¯á¶ážáááºáá¬ááá±á¬á· dataframe áá²á·ááá¯á·á DT ááẠlist áá áºáá¯á áá¯ááºááá¹áááá»á¬ážááᯠá¡ááœá±áááºáá¶áá«áááºá
DT ááŸáá·áº memory
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 ááẠá¡áááá¡á¬ážááŒáá·áº dataframe objects áá»á¬ážáá±á«áºááœáẠáá¯ááºáá±á¬ááºáá²á·áá±á¬ áá»á²á·ááœááºááŒááºážááŸáá·áº á¡ááŸáááºááŒáŸáá·áºááŒááºážáá»á¬ážá¡á¬ážááŒáá·áº R ááœáẠáá±áá¬ááœá²á·á ááºážáá¯á¶áá»á¬áž ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á á¡áááºá¡áááºáá áºáá¯ááŒá áºáááºá á¡ááŒá¬ážá¡áá®ááá»á¬ážáá¶á០á¡ááœá±ááᯠááááºážááááºážáá¬ážá ááºá
data.table áá¯ááºááá¹áááá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá á¥ááá¬á¡áá»áá¯á·
á á¬áááºážá¡áá±ááŒáá·áºâŠ
áá±áá¬áá±á¬ááºáá áºáᯠááá¯á·ááá¯áẠDT áá¡áááºážáá»á¬ážááᯠáááºáá«áááºáá«ááŒá¯áá¯ááºááŒááºážááẠá¡áá±á¬ááºážáá¯á¶ážá áááºáá°ážááá¯ááºáá«á ááœááºážáá¯ááºááẠáá¬áá¬á áá¬ážááŒáá·áºááŒá áºáá±á¬ááŒá±á¬áá·áºá R á¡áá»á¬ážááŒá®ážááŸá±ážáááºá Cááá¯á·áá±á¬áº á¡áá»á¬ážá¡á¬ážááŒáá·áº ááá¯áááºážáá±á¬ áá±á¬áºáá¶áá»á¬ážááᯠááŸáá·áºáááºááŒááºážááẠáá¯á¶ážá ááŒá áºááá¯ááºáááºá áá±á¬áºáá¶áá»á¬ážááᯠááŸáá·áºáááºááá·áºá¡áá« áá±á¬áºáá¶áá áºáá¯á á®ááẠáá¯á¶ááŸááºá¡á¬ážááŒáá·áº vector áá áºáá¯áá«ááŸááá±á¬ á á¬áááºážááŒááºá ááºáá áºáá¯ááŒá áºááŒá±á¬ááºáž áááááá«á ááŸáá·áº vector áá»á¬ážáá±á«áºááœáẠáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡ááŒá±áá¶áá¬áá¬á áá¬ážáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááœáẠáá±á¬ááºážááœááºá áœá¬ áá¯á¶áá±á¬áºáá¬ážáá«áááºá á á¬áááºážáá»á¬ážááŸáá·áº 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)))
ááá¯ážáááºááŒááºáž
á¡áááºá áááºááẠááŒá®ážáá¬ážáá±á¬ DT á¡áááºážáá»á¬ážááᯠáááºááá·áºááŒááºááá¯ááá¯áá«áá á¡áá±á¬ááºážáá¯á¶ážááŒá±ááŸááºážáá»ááºááŸá¬ vectorized function ááá¯áá±ážáááºááŒá áºáááºá áá«áá±ááá·áº á¡á²áá«á á¡áá¯ááºáááŒá áºáá°ážááá¯áááºáá±á¬á· ááŒáá¯ážááá¯ááºážááᯠááááááá¯ááºáá«á á¡ááœááºáž 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))
]
})
ááááŠážá áœá¬ á¡áááºážáá»á¬ážáá±á«áºááœáẠáááºáá«áááºáá« áá¯ááºáá±á¬ááºáá«-
áá°áá áº- áá®áá®á áá¹ááá·áº
expr áááá áº
{ dt[á `:=`(first_lá unlist(strsplit(wá split=""á fixed = T))[1]), by = 1:nrow(dt)] } 439.6217
lq ááá¯áááºááŸá¬ áá»ááºážáá»áŸ uq max neval ááŒá áºáááºá
451.9998 460.1593 456.2505 460.9147 621.4042 100
á á¬áááºážááᯠáááºááá áºá¡ááŒá áºááŒá±á¬ááºážááŒá®áž á¡ááœáŸááºáž 1 ááŒáá·áº á¡áá»ááºáááŒááºá ááºáá»á¬ážááᯠáá°ááŒááºážááŒáá·áº vectorization ááŒá áºáá±á«áºáá¬ááá·áº áá¯áááá¡ááŒá±ážááŒá áºáááºá á¡ááŸá¬ážááŒááºáááºááŒááºáž- áá¯ááºáá±á¬ááºáá»ááºá¡ááá·áºááœáẠvectorizationá strsplitVector ááᯠinput á¡ááŒá Ạáááºáá¶ááá¯ááºáá±á¬á á á¬áááºážáá áºáá¯á¡á¬áž matrix á¡ááŒá áºááá¯á·ááŒá±á¬ááºážáá²ááŒááºážáá¯ááºáá¯á¶ážáá¯ááºáááºážááẠvectorization ááá¯ááºááá¯ááºáá¯ááºáá±á¬ááºááŒááºážááẠáá»á¬ážá áœá¬ááá¯ááá¯ááŸá¯ááºááœá±ážáá±á¬áºáááºáž á€á¡ááŒá±á¡áá±ááœááºáááºá áááºážááẠnon-vectorized version áááºááá¯ááá¯ááŒááºáááºáá«áááºá
áá°áá áº- áá®áá®á áá¹ááá·áº
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 ááŒáááº.
ááááá¡ááŒá±ážá áááºááá áºáá°ážááŒá±á¬ááºážááŸá¯á¡á á®á¡á ááºááᯠááŒá±á¬ááºážáá²áá²á·áááºá
áá°áá áº- áá®áá®á áá¹ááá·áº
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 á¥ááᬠá¥ááá¬- ááá°áá®áá²á· á áá¬ážáá¯á¶ážá¡ááŸááºááœá±áá²á· ááá°áá®áá²á· á áá¬ážáá¯á¶ážá¡áá±á¡ááœááºá áááºááœááºáá»ááºááŸá¬ áááá áá¬ážáá¯á¶ážáá¯á¶ážáá¯á¶ážááᯠáá¯ááºáá°áááºááŒá áºáááºá áá®ááá¯áá»áá¯áž:

vector áá»á¬ážááẠááœá²ááŒá¬ážáá±á¬ á¡áá»á¬ážáá»á¬ážááŸáá·áº 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))
]
áá°áá
áº- áá®áá®á
áá¹ááá·áº
expr min lq ááá¯áááºááŸá¬ á¡áááºá¡áááºááŒá
áºáááºá
{ dt[, `:=`((paste0(âw_âá 1:3)), strsplit(w, split="", fixed = T))] } 851.7623 916.071 1054.5 1035.199
uq max neval
1178.738 1356.816 100
áá¬ááºááœáŸááºážááẠáá»ááºážáá»áŸá¡ááŒááºááŸá¯ááºáž 1 á áá¹ááá·áºááŒáá·áº áááºáááºáááºá áááá¯ážáá«áá°ážá
ááœááºážáááºáá áºáá¯ááŒáá·áº áá»áááºáááºáá¬ážáá±á¬...
chaining áá¯á¶ážááŒá®áž DT objects ááœá±áá²á· á¡áá¯ááºáá¯ááºááá¯ááºáá«áááºá áááºážááẠáá¬áááºááŸá ááœááºážá ááºážá¡áá¬ážá¡ááá¯áá»á¬ážááᯠááœááºážáááºáá¬ážáá¯á¶ááááºá á¡ááŒá±áá¶á¡á¬ážááŒáá·áº áááŒá¬ážá¡ááœáŸá¬áá áºáá¯ááŒá áºáááºá
áá¯ááº
# 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 ááᯠá¡áá¯á¶ážááŒá¯á áá°áá®áá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºáááºá áá¯á¶ááá¹áá¬ááºáá°áá±á¬áºáááºáž DT áá áºáá¯áááºážáááºááá¯ááºáá² áááºááá·áºáááºážáááºážáá»á¬ážááá¯áááᯠáá¯á¶ážááá¯ááºáá±á¬ááŒá±á¬áá·áº ááá¯ááá¯áá¯ááºáá±á¬ááºááá¯ááºááẠá DT filters á¡áá»á¬ážá¡ááŒá¬ážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááá±á«ááºážá ááºáá±áá¬á¡ááœáẠáá±á¬ááºáá¶á·ááá¯á·áá±á¬ááºáá±ážáá¯ááºáá¯ááºááŸá¯ááááºážááááºážáá»á¬ážááᯠááá°ááŒáá«á áá¯á·á
áá¯ááº
# 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 ááᯠááá·áºááºáá áºáá¯ááŸáá áºááá·áº 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 object á áá¯ááºáá¯á¶á á¡áá¯á¶ážá á¯á¶ áááŒáá·áºá á¯á¶áá±á¬áºáááºážá R á¡áááºážáá»á¬ážá០á¡ááœá±áááºáá¶ááŒááºážááá¯ááºáᬠáá¯ááºááá¹áááá»á¬ážá០áááºážá ááá¯ááºááá¯ááºá¡ááºá¹áá«áááºáá»á¬ážááŸáá·áº áááºáááºáá±á¬ ááŒááºá ááºáá»á¬ážá áááºáááºážáá»ááºá¡áá áá»ááºáá»ááºááŒáá·áºááŒáá·áº áááºáá®ážááá¯ááºáááºáᯠáá»áŸá±á¬áºááá·áºáá«áááºá áááºážááẠááá·áºá¡á¬áž á€á á¬ááŒáá·áºááá¯ááºááᯠááá¯ááá¯áá¬ážáááºááŒá®áž ááá·áºá¡áá¯ááºááœáẠá¡áá¯á¶ážáá»ááá¯ááºáááá·áºáááºáᯠáá»áŸá±á¬áºááá·áºáá«áááºá áá»á±á¬áºááŒá±áá±áž.

Thank you!
áá¯ááºá¡ááŒáá·áºá¡á á¯á¶
áá¯ááº
## 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)
source: www.habr.com
