Re: [問題] 創造dummy variable

作者: andrew43 (討厭有好心推文後刪文者)   2016-12-26 22:42:59
我不是很善長效率這件事,
但提供一個比你有效率的解決方案。
這個方案要改寫成平行處理也相對容易(但我沒做)。
library(magrittr)
# 創造 500000 * 100 的假資料
# 元素是 1:100 且有一半的機率是 NA
Nrow <- 500000
Nlevels <- 100
dt <-
c(1:Nlevels, rep(NA, Nlevels)) %>%
sample(., size = Nrow * Nlevels, replace = T) %>%
matrix(., Nrow, Nlevels)
max.val <- max(dt, na.rm = T)
t0 <- Sys.time()
res <- vector("list", nrow(dt))
for (i in 1:length(res)) {
res[[i]] <-
dt[i, ] %>% as.matrix %>%
table %>% attr("dimnames") %>% .[[1]] %>%
as.numeric
}
out <-
lapply(res, function(x) {
re <- logical(max.val)
re[x] <- T
return(re)
}) %>%
do.call("rbind", .)
Sys.time() - t0
# Time difference of 5.748979 mins
# out 為所求
※ 引述《clansoda (小笨)》之銘言:
: 各位好 單一變數創造dummy variable網路已經有很多答案了
: 我現在遇到的是要比對多個變數來創造dummy variable
: 假設我的data長下面這樣
: rowname a b c
: 1 2 5 NA
: 2 1 NA NA
: 3 1 2 3
: 4 3 NA NA
: 5 2 4 NA
: 6 1 4 5
: 希望能得到
: is.1 is.2 is.3 is.4 is.5
: 1
: FALSE TRUE FALSE FALSE FALSE
: 2
: TRUE FALSE FALSE FALSE FALSE
: 3
: TRUE TRUE TRUE FALSE FALSE
: 4
: FALSE TRUE FALSE TRUE FALSE
: 5
: FALSE TRUE FALSE TRUE FALSE
: 6 TRUE FALSE FALSE TRUE TRUE
: 6
: 這個例子是個簡單化的範本
: 一個row有可能分屬好幾個category 以第一個row舉例
: 他就屬於第二類跟第五類 第二個row則只屬於第一類
: 我現在的寫法是
: for (i in 1 : 5) {
: dat[, paste0("is.category", "i") := .SD[, 2 : 4] %in% "i" %>% any,
: by = 1 : nrow(dat)]
: }
: 目前我只會這樣寫 但是這個方法超慢 以我50萬個rows為例就要跑20分鐘
: 我相信有更好的寫法 只是我不知道如何寫 因此想請教各位

Links booklink

Contact Us: admin [ a t ] ucptt.com