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.

Reply via email to