On Mon, Aug 1, 2011 at 1:43 PM, Sarah Goslee <sarah.gos...@gmail.com> wrote: > Bert, > > On Mon, Aug 1, 2011 at 1:27 PM, Bert Gunter <gunter.ber...@gene.com> wrote: >> Folks: >> >> I consider my reply below rather clumsy: One has to keep track of >> index numbers other than that which is inserted and must separately >> change column names. Is there as "essentially better" way to do this, >> either via base R or via an R package. I leave it to you to define >> "essentially better."
A variation on the theme that I prefer for aesthetic reasons is a <- data.frame(A=1:10, B=11:20, D=31:40, E=41:50) a$F <- 21:30 a <- a[, c(1:2, 5, 3:4)] I doubt that it is "essentially better", as it still requires keeping track of the index, but to me this is easier to follow. Best, Ista >> > Having tried your solution with sample data, I'd have to agree. :) > Your approach does mess up the column names, and also doesn't work > if x is a matrix rather than data frame. Mine, using the full cbind(), works > in both cases, preserving the column names and running even if x is > a matrix. > > It could be written as a function, but since it's only one line and > really only requires knowing at what position you'd like to add > the new column, it hardly seems worth it unless it's something > to be done repeatedly. > >> x <- data.frame(A=1:3, B=1:3, C=1:3, D=1:3, E=1:3) >> newcol <- 4:6 >> cbind(x[,1:2], newcol, x[,3:ncol(x)]) > A B newcol C D E > 1 1 1 4 1 1 1 > 2 2 2 5 2 2 2 > 3 3 3 6 3 3 3 >> >> >> x[,3:6] <- cbind(newcol, x[,3:5]) >> x > A B C D E E.1 > 1 1 1 4 1 1 1 > 2 2 2 5 2 2 2 > 3 3 3 6 3 3 3 >> >> >> x <- data.frame(A=1:3, B=1:3, C=1:3, D=1:3, E=1:3) >> x <- as.matrix(x) >> cbind(x[,1:2], newcol, x[,3:ncol(x)]) > A B newcol C D E > [1,] 1 1 4 1 1 1 > [2,] 2 2 5 2 2 2 > [3,] 3 3 6 3 3 3 >> x[,3:6] <- cbind(newcol, x[,3:5]) > Error in x[, 3:6] <- cbind(newcol, x[, 3:5]) : subscript out of bounds > > Sarah > >> Thanks. >> >> Cheers, >> Bert >> >> On Mon, Aug 1, 2011 at 10:17 AM, Bert Gunter <bgun...@gene.com> wrote: >>> Doesn't work -- you lose column names. >>> >>> Try this instead: >>> >>> yourframe[,30:51] <- cbind( newcolumn,yourframe[,30:50]) >>> >>> Adjust column names after via: >>> >>> names(yourframe) [30:51] <- c(newcolname,names(yourframe[30:50]) >>> >>> Cheers, >>> Bert >>> >>> On Mon, Aug 1, 2011 at 10:10 AM, Sarah Goslee <sarah.gos...@gmail.com> >>> wrote: >>>> x <- cbind(x[,1:29], newcolumn, x[,30:ncol(x)]) >>>> >>>> On Mon, Aug 1, 2011 at 12:59 PM, Bansal, Vikas <vikas.ban...@kcl.ac.uk> >>>> wrote: >>>>> Dear all, >>>>> >>>>> I have a very simple question.I have data frame of 50 columns and i want >>>>> to insert a column in 30th position.But i do not want to delete that >>>>> column.Is it possible to include a column in between, so that new values >>>>> are in 30th column and 30 th column is now 31st and 31st is 32nd......so >>>>> on and 50th column is 51st..?I will be very thankful to you. >>>> > -- > Sarah Goslee > http://www.functionaldiversity.org > > ______________________________________________ > 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. > -- Ista Zahn Graduate student University of Rochester Department of Clinical and Social Psychology http://yourpsyche.org ______________________________________________ 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.