> -----Original Message----- > From: r-help-boun...@r-project.org > [mailto:r-help-boun...@r-project.org] On Behalf Of Doran, Harold > Sent: Thursday, February 25, 2010 10:35 AM > To: r-help@r-project.org > Subject: [R] Restructure some data > > Suppose I have a data frame like "dat" below. For some > context, this is the format that represents student's taking > a computer adaptive test. first.item is the first item that > student was administered and then score.1 is the student's > response to that item and so forth. > > item.pool <- paste("item", 1:10, sep = "") > set.seed(54321) > dat <- data.frame(id = c(1,2,3,4,5), first.item = > sample(item.pool, 5, replace=TRUE), > second.item = sample(item.pool, > 5,replace=TRUE), third.item = sample(item.pool, 5,replace=TRUE), > score1 = sample(c(0,1), 5,replace=TRUE), > score2 = sample(c(0,1), 5,replace=TRUE), score3 = > sample(c(0,1), 5,replace=TRUE)) > > I need to restructure this into a new format. The new matrix > df (after the loop) is exactly what I want in the end. But, > I'm annoyed at myself for not thinking of a more efficient > way to restructure this without using a loop. > > df <- matrix(NA, ncol = length(item.pool), nrow = nrow(dat)) > colnames(df) <- unique(item.pool) > > for(i in 1:5){ > for(j in 2:4){ > rr <- which(dat[i,j] == colnames(df)) > df[i,rr] <- dat[i, (j+3)] > } > } > > Any thoughts?
You can try subscripting by a 2-column matrix, the first giving the row index and the second the column index. E.g., > f <- function(dat) { allItems <- paste("item", 1:10, sep = "") items <- as.matrix(dat[2:4]) scores <- as.matrix(dat[, 5:7]) retval <- matrix(NA_real_, nrow = nrow(dat), ncol = 10, dimnames = list(character(), allItems)) retval[cbind(dat$id, match(items, allItems))] <- scores retval } > identical(f(dat), df) [1] TRUE That was a very nice problem description, letting me reproduce the example data and desired output with just copy and paste. Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com > > Harold > > [[alternative HTML version deleted]] > > ______________________________________________ > 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. > ______________________________________________ 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.