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 <dwinsem...@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
<jdnew...@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 <szee2...@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

______________________________________________
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