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: (d1 <- data.frame(ch.mat)) mode(d1[,1]) is.factor(d1[,1]) To prevent this, I can use 'I' to protect the column vectors: (d2 <- data.frame(x1 = I(ch.mat[,1]), x2 = I(ch.mat[,2]), x3 = I(ch.mat[,3]))) mode(d2[,1]) is.factor(d2[,2]) but this method is cumbersome if the matrix has many columns. 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? John -------------------------------------------------------------------- John Miyamoto, Dept. of Psychology, Box 351525 University of Washington, Seattle, WA 98195-1525 Phone 206-543-0805, Fax 206-685-3157 Homepage http://faculty.washington.edu/jmiyamot/
You could do it directly like this: structure(split(ch.mat, col(ch.mat)), row.names = 1:nrow(ch.mat), .Names = 1:ncol(ch.mat), class = "data.frame") On 2/23/06, John M. Miyamoto <jmiyamot at u.washington.edu> 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: > > (d1 <- data.frame(ch.mat)) > mode(d1[,1]) > is.factor(d1[,1]) > > To prevent this, I can use 'I' to protect the column vectors: > > (d2 <- data.frame(x1 = I(ch.mat[,1]), x2 = I(ch.mat[,2]), x3 > I(ch.mat[,3]))) > mode(d2[,1]) > is.factor(d2[,2]) > > but this method is cumbersome if the matrix has many columns. > 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? > > John > > -------------------------------------------------------------------- > John Miyamoto, Dept. of Psychology, Box 351525 > University of Washington, Seattle, WA 98195-1525 > Phone 206-543-0805, Fax 206-685-3157 > Homepage http://faculty.washington.edu/jmiyamot/ > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html >
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: > > (d1 <- data.frame(ch.mat)) > mode(d1[,1]) > is.factor(d1[,1]) > > To prevent this, I can use 'I' to protect the column vectors: > > (d2 <- data.frame(x1 = I(ch.mat[,1]), x2 = I(ch.mat[,2]), x3 > I(ch.mat[,3]))) > mode(d2[,1]) > is.factor(d2[,2]) > > but this method is cumbersome if the matrix has many columns. > 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? > > John > > -------------------------------------------------------------------- > John Miyamoto, Dept. of Psychology, Box 351525 > University of Washington, Seattle, WA 98195-1525 > Phone 206-543-0805, Fax 206-685-3157 > Homepage http://faculty.washington.edu/jmiyamot/ > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html >-- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595