[R] With an example - Re: rbind.data.frame drops attributes for factor variables

David Winsemius dwinsemius at comcast.net
Mon Nov 14 00:11:54 CET 2011


On Nov 13, 2011, at 11:28 AM, Sammy Zee wrote:

> dataset[ nrow(dataset), ] <- c ("Male", 5, "bad")
>
> The above seems to have worked to append a row in place of a  
> rbind(). This method does not drop the custom attributes from the  
> column. Do yo see any issue with this method.

Only that it wipes out whatever was in the last row, I suppose you  
could get around that issue by making a duplicate row:

dataset <- dataset[ c(1:dataset, nrow(dataset)), ]
dataset[ nrow(dataset), ] <- c ("Male", 5, "bad")

I generally use NROW rather than nrow but I cannot remember why.

-- 
David.

>
> Thanks,
> Sammy
>
> On Sat, Nov 12, 2011 at 10:16 PM, David Winsemius <dwinsemius at comcast.net 
> > wrote:
>
> On Nov 12, 2011, at 6:40 PM, Sammy Zee wrote:
>
> Thanks David. Besides rbind(), is there any other way to add a row  
> to a data frame so that I do not lose the custom attributes.
>
> I have already told you the method that I know of. You don't seem to  
> have taken my poin that it is not a data.frame specific problem but  
> rahter a facor problem. You are welcome to redefine  
> `rbind.data.frame`. The R language is rather flexible in that manner.
>
> -- 
> David.
>
>
> Thanks,
> Sammy
>
> On Sat, Nov 12, 2011 at 5:17 PM, David Winsemius <dwinsemius at comcast.net 
> > wrote:
>
> On Nov 12, 2011, at 2:47 PM, Sammy Zee wrote:
>
> When I use rbind() or rbind.data.frame() to add a row to an existing
> dataframe, it appears that attributes for the column of type  
> "factor" are
> dropped. See the sample example below to reproduce the problem. Please
> suggest How I can fix this.
>
>
> Thanks,
> Sammy
>
> a=c("Male", "Male", "Female", "Male")
> b=c(1,2,3,4)
> c=c("great", "bad", "good", "bad")
> dataset<- data.frame (gender = a, count = b, answer = c)
>
> dataset
>
> gender count answer
> 1   Male     1  great
> 2   Male     2    bad
> 3 Female     3   good
> 4   Male     4    bad
>
>
> attributes(dataset$answer)
> $levels
> [1] "bad"   "good"  "great"
>
> $class
> [1] "factor"
>
> Now adding some custom attributes to column dataset$answer
>
> attributes(dataset$answer)<-c(attributes(dataset 
> $answer),list(newattr1="custom-attr1"))
> attributes(dataset$answer)<-c(attributes(dataset 
> $answer),list(newattr2="custom-attr2"))
>
> If you look through the code of rbind.data.frame you see that column  
> values are processed with the 'factor' function.
>
>
> > attributes(dataset$answer)
> $levels
> [1] "bad"   "good"  "great"
>
> $class
> [1] "factor"
>
> $newattr1
> [1] "custom-attr1"
>
> $newattr2
> [1] "custom-attr2"
>
> > attributes(factor(dataset$answer))
>
> $levels
> [1] "bad"   "good"  "great"
>
> $class
> [1] "factor"
>
>
> So I think you are out of luck. You will need to restore the  
> "special attributes" yourself.
>
> -- 
> David.
>
>
> attributes(dataset$answer)
> $levels
> [1] "bad"   "good"  "great"
>
> $class
> [1] "factor"
>
> $newattr1
> [1] "custom-attr1"
>
> $newattr2
> [1] "custom-attr2"
>
> However as soon as I add a row to this data frame ("dataset") by  
> rbind(),
> it loses the custom
> attributes ("newattr1" and "newattr2") I have just added
>
> newrow = c(gender="Female", count = 5, answer = "great")
>
> dataset <- rbind(dataset, newrow)
>
> attributes(dataset$answer)
> $levels
> [1] "bad"   "good"  "great"
>
> $class
> [1] "factor"
>
> the two custom attributes are dropped!! Any suggestion why this is
> happening.
>
> On Fri, Nov 11, 2011 at 11:44 AM, Jeff Newmiller
> <jdnewmil at dcn.davis.ca.us>wrote:
>
> As the doctor says, if it hurts "don't do that".
>
> A factor is a sequence of integers with a corresponding list of  
> character
> strings. Factors in two separate vectors can and usually do map the  
> same
> integer to different strings, and R cannot tell how you want that  
> resolved.
>
> Convert these columns to character before combining them, and only  
> convert
> to factor when you have all of your possibilities present (or you  
> specify
> them in the creation of the factor vector).
> ---------------------------------------------------------------------------
> Jeff Newmiller                        The     .....       .....  Go  
> Live...
>
> Sammy Zee <szee2007 at gmail.com> wrote:
>
> Hi all,
>
> When I use rbind() or rbind.data.frame() to add a row to an existing
> dataframe, it appears that attributes for the column of type "factor"
> are
> dropped. I see the following post with same problem. However i did not
> see
> any reply to the following posting offering a solution. Could someone
> please help.
>
>
> http://r.789695.n4.nabble.com/rbind-data-frame-drops-attributes-for-factor-variables-td919575.html
>
> Thanks,
> Sammy
>
>    [[alternative HTML version deleted]]
>
> ___
>
>
> David Winsemius, MD
> West Hartford, CT
>
>

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list