Thanks Sarah and David.

Yes, but note this:

> z <- data.frame(a=1:2,b=3:4)
> z
  a b
1 1 3
2 2 4
> newdat <- 5:6
> cbind(z[,1],newdat,z[,2])
       newdat
[1,] 1      5 3
[2,] 2      6 4

> cbind.data.frame(z[,1],newdat,z[,2])
  z[, 1] newdat  z[, 2]
1      1       5        3
2      2       6        4

Aha moment! -- You need drop=FALSE:

 cbind(z[,1,drop=FALSE],newdat,z[,2,drop=FALSE])
  a newdat b
1 1      5 3
2 2      6 4


So your solution does not work in general (and you may not have
intended it to); while mine does, but is blatantly clumsy. I would say
the "better" approach is merely to add the drop = FALSE option to
yours even though it is unnecessary in your simple example:

 cbind(x[,1:2,drop = FALSE], newcol, x[,3:ncol(x)], drop= FALSE)

... and I would definitely count this as an R 'gotcha' . (and it has
gotcha'ed me before).

Cheers,
-- Bert


On Mon, Aug 1, 2011 at 10:37 AM, Sarah Goslee <sarah.gos...@gmail.com> wrote:
> Bert,
>
> On Mon, Aug 1, 2011 at 1:17 PM, Bert Gunter <gunter.ber...@gene.com> wrote:
>> Doesn't work -- you lose column names.
>
> But I don't lose column names:
>
>> x <- data.frame(A=1:3, B=1:3, C=1:3, D=1:3, E=1:3)
>> x
>  A B C D E
> 1 1 1 1 1 1
> 2 2 2 2 2 2
> 3 3 3 3 3 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
>
> It's even possible to change names in the cbind() statement:
>
>> cbind(x[,1:2], Y=newcol, x[,3:ncol(x)])
>  A B Y C D E
> 1 1 1 4 1 1 1
> 2 2 2 5 2 2 2
> 3 3 3 6 3 3 3
>
> If for some reason it isn't working for you, you might try explicitly calling
> cbind.data.frame() instead of the default cbind().
>
>
>> 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])
>
> This shouldn't be necessary, I think. What happens if you use my
> above example?
>
> Sarah
>
>
>> 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.

Reply via email to