HI Craig,
Assuming that this is similar to what you tried:

dat <- read.table(text="member code
1 A
1 C
1 F
2 B
2 E
3 D
3 A
3 B
3 D
4 G
4 A",sep="",header=TRUE,stringsAsFactors=FALSE)
 code.list <- LETTERS[1:5]
n.mbr <- 4
 mbr.list <- 1:4
matrix.mat <- 
matrix(0,ncol=length(code.list),nrow=length(unique(dat$member)),dimnames=list(NULL,code.list))
 for(i in 1:n.mbr){
 mbr.i <- dat[dat$member==mbr.list[i],]
 matrix.mat[i,unique(match(mbr.i$code,code.list))]<- 1
 }
matrix.mat1 <- cbind(member=mbr.list,matrix.mat)
matrix.mat1

##This could be also done by:
library(reshape2)
res <- dcast(dat,member~code,length,value.var="code")
 res1 <- res[,c(TRUE,names(res)[-1] %in% code.list)]
res1[,-1][res1[,-1]>1] <- 1
res1

A.K.







I have a medical insurance datafile divided into blocks by member, with 
multiple lines per member. I am processing these into a one line per 
member model matrix. Member block sizes vary from 1 to 50+. I am 
matching attributes in claims data to columns in the model matrix and 
have been getting by with a for loop, but for large files it takes much 
too long. Is there vectorized/apply based method to do this more 
efficiently? 

thanks in advance, Craig McKinstry 

input data: 
member  code 
1       A 
1       C 
1       F 
2       B 
2       E 
3       D 
3       A 
3       B 
3       D 
4       G 
4       A 

code.list <- c(A,B,C,D,E) 
for(i in 1:n.mbr){ 
  mbr.i <- dat[dat$Rmbr==mbr.list[i],]  #EXTRACT BLOCK OF MEMBER CLAIMS 
  matrix.mat[i,unique(match(mbr.i$code,code.list))] <- 1 
} 

output model.matrix 
Member  A       B       C       D       E 
1       1       0       1       0       0 
2       0       1       0       0       1 
3       1       1       0       1       0 
4       1       0       0       0       0

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to