Here are two ways of turning a character vector like yours into a data.frame, neither of which uses an apply-like function. > s <- c(XVI="p,16", XVII="q,17", XVIII="r,18") > d1 <- data.frame(Letter=sub(",.*", "", s), Number=as.integer(sub(".*,","",s))) > d2 <- read.table(text=s, sep=",", col.names=c("Letter","Number"), row.names=names(s)) > d1 Letter Number XVI p 16 XVII q 17 XVIII r 18 > all.equal(d1, d2) [1] TRUE
I don't agree with your analysis of what went wrong with your example > z0 <- as.data.frame(t(sapply(c("a,1","b,2","c,3"),function (n) strsplit(n,",")[[1]]))) > str(z0) 'data.frame': 3 obs. of 2 variables: $ V1: Factor w/ 3 levels "a","b","c": 1 2 3 ..- attr(*, "names")= chr "a,1" "b,2" "c,3" $ V2: Factor w/ 3 levels "1","2","3": 1 2 3 ..- attr(*, "names")= chr "a,1" "b,2" "c,3" You wrote > I could, of course, do ret$V2 <- as.numeric(ret$V2) but this would mean > a double conversion: from number to string first (by c()) and then back. The "numbers" 1,2,3 were always considered to be strings, because strsplit() takes strings, like "a,1", and returns a list of vectors of strings, like list(c("a","1")). The c() function has nothing to do with it. Functions like read.table() will guess when it is appropriate to convert things from strings to numbers, but most times you have to do the conversion explicitly. Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com > -----Original Message----- > From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org] On > Behalf > Of Sam Steingold > Sent: Thursday, August 30, 2012 9:44 AM > To: r-help@r-project.org > Subject: Re: [R] apply --> data.frame > > > * Sam Steingold <f...@tah.bet> [2012-08-30 08:56:17 -0400]: > > > > Is there a way for an apply-type function to return a data frame? > > the closest thing I think of is > > > > foo <- as.data.frame(t(sapply(...))) > > names(foo) <- c(....) > > alas, this has a problem of creating a "homogeneous" data frame, i.e., > all the columns are numbers or characters, because the function passed > to sapply returns c(....) and > > c(1,2,"a") > [1] "1" "2" "a" > > e.g., > as.data.frame(t(sapply(c("a,1","b,2","c,3"),function (n) > strsplit(n,",")[[1]]))) > V1 V2 > a,1 a 1 > b,2 b 2 > c,3 c 3 > > 'data.frame': 3 obs. of 2 variables: > $ V1: Factor w/ 3 levels "a","b","c": 1 2 3 > ..- attr(*, "names")= chr "a,1" "b,2" "c,3" > $ V2: Factor w/ 3 levels "1","2","3": 1 2 3 > ..- attr(*, "names")= chr "a,1" "b,2" "c,3" > > I wanted the V1 column to be a string, and V2 to be a number. > (I know stringsAsFactors=FALSE would replace factors with strings, but I > need a string and a number) > > I could, of course, do ret$V2 <- as.numeric(ret$V2) but this would mean > a double conversion: from number to string first (by c()) and then back. > > thanks. > > -- > Sam Steingold (http://sds.podval.org/) on Ubuntu 12.04 (precise) X > 11.0.11103000 > http://www.childpsy.net/ http://mideasttruth.com http://truepeace.org > http://openvotingconsortium.org http://ffii.org http://www.memritv.org > Diplomacy is the art of saying "nice doggy" until you can find a nice rock. > > ______________________________________________ > 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. ______________________________________________ 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.