Re: [问题] 制作dummy variable矩阵效能问题

楼主: tan800630 (天ㄦ)   2017-12-29 15:23:39
同上一篇我自己的回文,这个code绝对还有很大的进步空间:p
请版上的各位再不吝指教
我自己想的方向是先把资料整理成long_format的资料格式,再用dcast转形状
模拟的资料笔数较大时两个方法运作时间会差比较多
因此我把n设成10000而非原本的1000(在n=1000时甚至你的方法比较快一点)
希望对你有帮助:)
code:https://ideone.com/sVCoRD
require(dplyr)
require(data.table)
#前置作业如原文
w2long=function(array){
lapply(c(1:length(array)),function(i) {
data.table("id"=i,"player"=as.character(array[i]) %>%
strsplit(", ") %>% .[[1]])
}) %>% rbindlist()
}
out=merge(
w2long(data$p.combination) %>% mutate(show=1) %>%
dcast(id~player,value.var="show"),
w2long(data$p.com.allowed) %>% mutate(show=-1) %>%
dcast(id~player,value.var="show"),by="id",suffix=c("_O","_D")
)
out[is.na(out)]=0
※ 引述《mowgur (PINNNNN)》之铭言:
: - 问题: 当你想要问问题时,请使用这个类别。
: 建议先到 http://tinyurl.com/mnerchs 搜寻本板旧文。
: [问题类型]:
: 效能咨询(我想让R 跑更快)
: [软件熟悉度]:
: 使用者(已经有用R 做过不少作品)
: [问题叙述]:
: 大家好 我的资料是纪录篮球比赛每个play是哪5个进攻及防守球员在场上
: 想做的事情是: 假设总共有500位球员 做出一个n(750000) x p(1000)的矩阵
: 前500栏为进攻 后500栏为防守
: 矩阵内的元素为1代表球员在场上进攻(防守为-1) 不在场上为0
: 所以每列会有5个1及5个-1还有很多个0
: 资料大概长这样
: data$p.combination data$p.com.allowed
: 1 A, B, C, D, E J, K, L, M, N
: 2 A, C, F, H, I K, L, M, N, O
: 3 C, D, X, Y, Z K, M, O, Q, R
: ... ... ...
: 人名之间是用逗号和一个空格分开
: 用我自己写的已经跑了快12小时还没跑完
: 想请教版上各位大大有没有更好的写法
: [程式范例]:
: https://ideone.com/PaBtM4
: library(magrittr)
: p.combination = character(1000)
: for(i in 1:length(p.combination)){
: p.combination[i] = LETTERS[sample(1:26,5)] %>% paste0(collapse = ", ")
: }
: p.com.allowed = character(1000)
: for(i in 1:length(p.com.allowed)){
: p.com.allowed[i] = LETTERS[sample(1:26,5)] %>% paste0(collapse = ", ")
: }
: data = data.frame(p.combination = p.combination,
: p.com.allowed = p.com.allowed)
: player = LETTERS[1:26]
: input.matrix0 = function(data, player, off){
: X = matrix(ncol = length(player), nrow = dim(data)[1])
: for(i in 1:dim(data)[1]){
: if(off) {
: colnames(X) = paste0("O_",player)
: coding = 1
: pp = data$p.combination
: } else {
: colnames(X) = paste0("D_",player)
: coding = -1
: pp = data$p.com.allowed
: }
: player.temp = pp[i] %>% gsub(", ", "|",.)
: index = grep(player.temp, player)
: X[i,index] = coding
: X[i,-index] = 0
: }
: return(X)
: }
: input.matrix = function(data, player){
: X.off = input.matrix0(data, player, T)
: X.def = input.matrix0(data, player, F)
: return(cbind(X.off, X.def))
: }
: out = input.matrix(data,player)
作者: andrew43 (讨厌有好心推文后删文者)   2017-12-30 00:32:00
来解题请不必自谦。有写解题想法大致流程也很棒。

Links booklink

Contact Us: admin [ a t ] ucptt.com