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