Hi all, I am trying to concatenate words together to create new column names, using a loop. Please consider the following toy example: x <- matrix(nrow = 1, ncol = 3) colnames(x) <- c("a", "b", "c") x[1,1] <- "1" x[1,2] <- "2" x[1,3] <- "3" I would like to create a new matrix with column names based on the column names in x. Specifically, I would like the column names in y to be "q_" plus the corresponding column name in x. So y[,1] should be named "q_a", y[,2] should be names "q_b", and y[,3] should be named "q_c". Here is the code I am trying: y <- matrix(nrow = nrow(x), ncol = ncol(x)) for (i in 1:ncol(x)){ colnames(y)[i] <- paste("q_", (colnames(x)[i]), sep = "") } Alas, it does not work. I get the following error (from the console window): Error in dimnames(x) <- dn : length of 'dimnames' [2] not equal to array extent Can any of you help to debug my code? Please consider the following constraints: (1) In reality, my dataset has many more than three columns, so I must use a loop. (2) I would like my code to be robust against changes in the column numbers of the x matrix. That is why I am telling R to look up the number of rows and columns in the x matrix when constructing the y matrix, rather than just putting in a hard count for the number of rows and columns in the y matrix. Thanks in advance, Josh Banta [[alternative HTML version deleted]]
Try this: colnames(y) <- sprintf('q_%s', colnames(x)) On Mon, Jul 19, 2010 at 4:35 PM, Josh B <joshb41@yahoo.com> wrote:> Hi all, > > I am trying to concatenate words together to create new column names, using > a > loop. > > Please consider the following toy example: > > x <- matrix(nrow = 1, ncol = 3) > colnames(x) <- c("a", "b", "c") > x[1,1] <- "1" > x[1,2] <- "2" > x[1,3] <- "3" > > I would like to create a new matrix with column names based on the column > names > in x. Specifically, I would like the column names in y to be "q_" plus the > corresponding column name in x. So y[,1] should be named "q_a", y[,2] > should be > names "q_b", and y[,3] should be named "q_c". > > > Here is the code I am trying: > > y <- matrix(nrow = nrow(x), ncol = ncol(x)) > for (i in 1:ncol(x)){ > colnames(y)[i] <- paste("q_", (colnames(x)[i]), sep = "") > } > > Alas, it does not work. I get the following error (from the console > window): > > Error in dimnames(x) <- dn : > length of 'dimnames' [2] not equal to array extent > > > Can any of you help to debug my code? Please consider the following > constraints: > (1) In reality, my dataset has many more than three columns, so I must use > a > loop. > (2) I would like my code to be robust against changes in the column numbers > of > the x matrix. That is why I am telling R to look up the number of rows and > columns in the x matrix when constructing the y matrix, rather than just > putting > in a hard count for the number of rows and columns in the y matrix. > > > Thanks in advance, > Josh Banta > > > > > [[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. >-- Henrique Dallazuanna Curitiba-Paraná-Brasil 25° 25' 40" S 49° 16' 22" O [[alternative HTML version deleted]]
"so I must use a loop." is almost never true in R. This works: colnames(y) <- paste("q_", colnames(x), sep = "") HTH, Josh On Mon, Jul 19, 2010 at 12:35 PM, Josh B <joshb41 at yahoo.com> wrote:> Hi all, > > I am trying to concatenate words together to create new column names, using a > loop. > > Please consider the following toy example: > > x <- matrix(nrow = 1, ncol = 3) > colnames(x) <- c("a", "b", "c") > x[1,1] <- "1" > x[1,2] <- "2" > x[1,3] <- "3" > > I would like to create a new matrix with column names based on the column names > in x. Specifically, I would like the column names in y to be "q_" plus the > corresponding column name in x. So y[,1] should be named "q_a", y[,2] should be > names "q_b", and y[,3] should be named "q_c". > > > Here is the code I am trying: > > y <- matrix(nrow = nrow(x), ncol = ncol(x)) > for (i in 1:ncol(x)){ > ? ?colnames(y)[i] <- paste("q_", (colnames(x)[i]), sep = "") > } > > Alas, it does not work. I get the following error (from the console window): > > Error in dimnames(x) <- dn : > ?length of 'dimnames' [2] not equal to array extent > > > Can any of you help to debug my code? Please consider the following constraints: > (1) In reality, my dataset has many more than three columns, so I must use a > loop. > (2) I would like my code to be robust against changes in the column numbers of > the x matrix. That is why I am telling R to look up the number of rows and > columns in the x matrix when constructing the y matrix, rather than just putting > in a hard count for the number of rows and columns in the y matrix. > > > Thanks in advance, > Josh Banta > > > > > ? ? ? ?[[alternative HTML version deleted]] > > ______________________________________________ > R-help at 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. >-- Joshua Wiley Ph.D. Student, Health Psychology University of California, Los Angeles http://www.joshuawiley.com/
Josh B wrote:> Hi all, > > I am trying to concatenate words together to create new column names, using a > loop. > > Please consider the following toy example: > > x <- matrix(nrow = 1, ncol = 3) > colnames(x) <- c("a", "b", "c") > x[1,1] <- "1" > x[1,2] <- "2" > x[1,3] <- "3" > > I would like to create a new matrix with column names based on the column names > in x. Specifically, I would like the column names in y to be "q_" plus the > corresponding column name in x. So y[,1] should be named "q_a", y[,2] should be > names "q_b", and y[,3] should be named "q_c". > > > Here is the code I am trying: > > y <- matrix(nrow = nrow(x), ncol = ncol(x))Does... colnames(y) <- paste("q_", colnames(x), sep = "") work? <snip>> Can any of you help to debug my code? Please consider the following constraints: > (1) In reality, my dataset has many more than three columns, so I must use a > loop.Not true! R has many functions like colnames that are vectorized, i.e., operate on vectors of arbitrary length, making for-loops unnecessary!