[R] why doesn't as.character of this factor create a vector ofcharacters?

Michael Lachmann lachmann at eva.mpg.de
Sat Sep 1 18:48:55 CEST 2007


This message didn't seem to have been somewhat forgotten. Here is a reply.

When you constructed the data.frame, all strings were converted to
factors. If you didn't want that, it would have been possible to
specify it:

df<-data.frame(a=a,b=b,c=c,stringsAsFactors=F)

Then everything would work as intended:

one.line<-as.character(df[df$a=="Abraham",])

Actually, the real problem is that df[df$a=="Abraham",] returns a
list. There is no need to use as.character here, just unlist:

one.line<-unlist(df[df$a=="Abraham",])

The returned list is also the problem with your code.

If you have a data.frame with factors, then

df[df$a=="Abraham",]

returns a list. Each element of this list is a factor, and has a
different set of levels. Thus, look at the following output:
> c(df[df$a=="Abraham",])
$a
[1] Abraham
Levels: Abraham Jonah Moses

$b
[1] Sarah
Levels: Hannah Mary Sarah

$c
[1] Billy
Levels: Billy Bob Joe

It is quite obvious why it is so complicated to untangle these. I
think the best way would be:

one.line<- sapply(df[df$a=="Abraham",],as.character)

Michael

-----Original Message-----
From: r-help-bounces_at_stat.math.ethz.ch
[mailto:r-help-bounces_at_stat.math.ethz.ch] On Behalf Of Andrew Yee
Sent: Tuesday, July 10, 2007 8:57 AM
To: r-help_at_stat.math.ethz.ch
Subject: [R] why doesn't as.character of this factor create a vector
ofcharacters?

I'm trying to figure out why when I use as.character() on one row of a
data.frame, I get factor numbers instead of a character vector. Any
suggestions?

See the following code:

a<-c("Abraham","Jonah","Moses")
b<-c("Sarah","Hannah","Mary")
c<-c("Billy","Joe","Bob")


df<-data.frame(a=a,b=b,c=c)

#Suppose I'm interested in one line of this data frame but as a vector

one.line <- df[df$a=="Abraham",]

#However the following illustrates the problem I'm having

one.line <- as.vector(df[df$a=="Abraham",]) #Creates a one row
data.frame instead of a vector!

#compare above to

one.line <- as.character(df[df$a=="Abraham",]) #Creates a vector of 1, 3, 1!

#In the end, this creates the output that I'd like:

one.line <-as.vector(t(df[df$a=="Abraham",])) #but it seems like a lot of work!



More information about the R-help mailing list