Michael Lachmann
2007-Sep-01 16:48 UTC
[R] why doesn't as.character of this factor create a vector ofcharacters?
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!
Michael Lachmann
2007-Sep-01 19:11 UTC
[R] why doesn't as.character of this factor create a vector ofcharacters?
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
<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!