Hi, I often need to take columns from two data.frames and 'splice' them together (alternately taking a column from the first data frame, then from the second). For example: x <- table(sample(letters[1:9], 100, replace=TRUE), sample(letters[1:4], 100, replace=TRUE)) y <- prop.table(x) splice <- function (x, y) { z <- matrix(rep(NA, (ncol(x) * 2) * nrow(x)), nrow = nrow(x)) j <- 1 for (i in seq(1, ncol(z), by = 2)) { z[, i] <- x[, j] z[, (i + 1)] <- y[, j] j <- j + 1 } z <- data.frame(z) rownames(z) <- rownames(x) z } splice(x, y) Manually using indexing I can do this: zz <- data.frame(x[, 1], y[, 1], x[, 2], y[, 2], x[, 3], y[, 3], x[, 4], y[, 4]) I *feel* that it should be possible in R to generate the sequence of column indexes automatically. I can get close with this: i <- paste("x[,", 1:ncol(x), "], ", "y[,", 1:ncol(y), "]", collapse=", ") which creates a string version of what I want, but I am not sure how to use that with data.frame. FAQ 7.21 ("How can I turn a string into a variable?") looked promising but I have not been able to apply any of the suggestions to this problem. I also tried using do.call: i <- paste("x[,", 1:4, "],", "y[,", 1:4, "]", collapse=",") i <- gsub("],", "]@", i) # Create a marker for i <- strsplit(i, "@") # strsplit to create a list do.call(data.frame, i) and with lapply: lappy(i, data.frame) These "did not work" (i.e. they worked as they were designed to and did not give me the results I am after). I think I need a nudge or two in the right direction. Thanks. Dave -- David Whiting School of Clinical Medical Sciences, The Medical School University of Newcastle upon Tyne, NE2 4HH, UK.
what about: @ <<*>>z<-data.frame(matrix(rbind(x,y),nrow(x),2*ncol(x))) rownames(z)<-rownames(x) z @ output-start Thu Aug 25 11:24:29 2005 X1 X2 X3 X4 X5 X6 X7 X8 a 2 0.02 1 0.01 2 0.02 2 0.02 b 3 0.03 0 0.00 4 0.04 3 0.03 c 3 0.03 2 0.02 1 0.01 6 0.06 d 3 0.03 4 0.04 2 0.02 3 0.03 e 4 0.04 1 0.01 4 0.04 2 0.02 f 2 0.02 5 0.05 2 0.02 2 0.02 g 4 0.04 5 0.05 3 0.03 3 0.03 h 3 0.03 3 0.03 5 0.05 4 0.04 i 1 0.01 0 0.00 3 0.03 3 0.03 output-end Peter Wolf David Whiting wrote:>Hi, > >I often need to take columns from two data.frames and 'splice' them >together (alternately taking a column from the first data frame, then >from the second). For example: > >x <- table(sample(letters[1:9], 100, replace=TRUE), > sample(letters[1:4], 100, replace=TRUE)) >y <- prop.table(x) > >splice <- function (x, y) { > z <- matrix(rep(NA, (ncol(x) * 2) * nrow(x)), nrow = nrow(x)) > j <- 1 > for (i in seq(1, ncol(z), by = 2)) { > z[, i] <- x[, j] > z[, (i + 1)] <- y[, j] > j <- j + 1 > } > z <- data.frame(z) > rownames(z) <- rownames(x) > z >} > >splice(x, y) > > >Manually using indexing I can do this: > >zz <- data.frame(x[, 1], y[, 1], x[, 2], y[, 2], x[, 3], y[, 3], x[, 4], >y[, 4]) > > >I *feel* that it should be possible in R to generate the sequence of >column indexes automatically. I can get close with this: > >i <- paste("x[,", 1:ncol(x), "], ", > "y[,", 1:ncol(y), "]", > collapse=", ") > >which creates a string version of what I want, but I am not sure how to >use that with data.frame. FAQ 7.21 ("How can I turn a string into a >variable?") looked promising but I have not been able to apply any of >the suggestions to this problem. I also tried using do.call: > >i <- paste("x[,", 1:4, "],", "y[,", 1:4, "]", collapse=",") >i <- gsub("],", "]@", i) # Create a marker for >i <- strsplit(i, "@") # strsplit to create a list >do.call(data.frame, i) > >and with lapply: > >lappy(i, data.frame) > >These "did not work" (i.e. they worked as they were designed to and did >not give me the results I am after). > >I think I need a nudge or two in the right direction. > >Thanks. > >Dave > >
Maybe Matching Threads
- Too many references: cannot splice
- [PATCH 52/56] drivers/char/virtio: support compiling out splice
- [PATCH 52/56] drivers/char/virtio: support compiling out splice
- new bquote feature splice does not address a common LISP @ use case?
- [PATCH] ocfs2: Update atime in splice read if necessary.