Skip to content
Back to formatted view

Raw Message

Message-ID: <Pine.WNT.4.63.0602240052150.1436@miyamoto.psych.washington.edu>
Date: 2006-02-24T08:58:35Z
From: John M. Miyamoto
Subject: converting character matrix to a dataframe
In-Reply-To: <Pine.LNX.4.64.0602240727450.2717@gannet.stats.ox.ac.uk>

On Fri, 24 Feb 2006, Prof Brian Ripley wrote:

> It is a bit more efficient to use as.data.frame in your apply.
>
> You could make a copy of as.data.frame.matrix (under another name) and remove 
> the special-casing of character matrices.  This would efficiently give you a 
> data frame with character columns, but they would then not be treated 'AsIs' 
> in subsequent manipulations.  So this is only desirable if efficiency is 
> really important (and it seems unlikely to me that it is).
>
> On Thu, 23 Feb 2006, John M. Miyamoto wrote:
>
>> Dear R-Help,
>>    Suppose I have a character matrix, e.g.,
>> 
>> (ch.mat <- matrix(c('a','s','*','f','w','*','k','*','*','f','i','o'),
>> ncol=3))
>> 
>> When I convert 'ch.mat' to a dataframe, the columns are converted to
>> factors:
[SNIP]
>> The following code is reasonably efficient even if the matrix has
>> arbitrarily many columns.
>> 
>> (d3 <- data.frame(apply(ch.mat,2,function(x) data.frame(I(x)))))
>> mode(d3[,1])
>> is.factor(d3[,1])
>> 
>> Question:  Is there a more efficient method than the last one for
>> converting a character matrix to a dataframe while preventing the
>> automatic conversion of the column vectors to factors?

So I take it that this last solution would be:

(ch.mat <- matrix(c('a','s','*','f','w','*','k','*','*','f','i','o'), 
ncol=3))

(d4 <- data.frame(apply(ch.mat, 2, function(x) as.data.frame(I(x)))))
mode(d4[,1])
is.factor(d4[,1])

You're right that I'm not really concerned with computational efficiency, 
but only minimizing the amount of code that I have to write and remember. 
The solution seems to be that I should write a function that accomplishes 
this task, which I have done.  Thank you.

John