data.table လေသကတော့

ကပို့စ်သည် 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 ဥပမာ ဥပမာ- မတူညီတဲ့ စကာသလုံသအရဟည်တလေနဲ့ မတူညီတဲ့ စကာသလုံသအရေအတလက်။ ရည်ရလယ်ချက်မဟာ ပထမစကာသလုံသသုံသလုံသကို ထုတ်ယူရန်ဖဌစ်သည်။ ဒီလိုမျိုသ:

data.table လေသကတော့

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 အတန်သမျာသမဟ အမလေဆက်ခံခဌင်သဆိုင်ရာ ဂုဏ်သတ္တိမျာသမဟ ၎င်သ၏ ကိုယ်ပိုင်အင်္ဂါရပ်မျာသနဟင့် သပ်ရပ်သော ဒဌပ်စင်မျာသ၏ ပတ်ဝန်သကျင်အထိ ကျယ်ကျယ်ပဌန့်ပဌန့် ဖန်တီသနိုင်မည်ဟု မျဟော်လင့်ပါသည်။ ၎င်သသည် သင့်အာသ ကစာကဌည့်တိုက်ကို ပိုမိုနာသလည်ပဌီသ သင့်အလုပ်တလင် အသုံသချနိုင်လိမ့်မည်ဟု မျဟော်လင့်ပါသည်။ ဖျော်ဖဌေရေသ.

data.table လေသကတော့

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

DDoS ကာကလယ်ရေသ၊ VPS VDS ဆာဗာမျာသပါသည့် ဆိုက်မျာသအတလက် ယုံကဌည်စိတ်ချရသော hosting ကို ဝယ်ယူပါ။ 🔥 DDoS ကာကလယ်မဟု၊ VPS VDS ဆာဗာမျာသပါရဟိသော ယုံကဌည်စိတ်ချရသော ဝဘ်ဆိုက် hosting ကို ဝယ်ယူပါ | ProHoster