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

Petr PIKAL petr.pikal at precheza.cz
Mon Nov 14 08:29:22 CET 2011


> 
> dataset[ nrow(dataset), ] <- c ("Male", 5, "bad")
> 
> The above seems to have worked to append a row in place of a rbind(). 
This

No. It overwrites your last row. You maybe meant

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

Regards
Petr


> method does not drop the custom attributes from the column. Do yo see 
any
> issue with this method.
> 
> 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<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
> >
> >
> 
>    [[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.



More information about the R-help mailing list