Hello,

Em 31-08-2012 11:35, Martin Maechler escreveu:
Hi Rui,

I think when people are asking how to do such basic things in R,
the answer should *not* be to use a (non-base / -recommended)
package...

You're right, that's why I've called it an alternative.


but then, you may have really wanted to advertize plyr,
so never mind.

It' usefull to know that those extra *ply functions are available.

Anyway, my vote goes to Bill Dunlap's read.table solution. I would never have thought of that one.

Rui Barradas

Martin

"RB" == Rui Barradas <ruipbarra...@sapo.pt>
     on Thu, 30 Aug 2012 18:57:34 +0100 writes:
     RB> Hello,

     RB> Yet another alternative.


     RB> library(plyr)
     RB> dfr <- ldply(strsplit(c("a,1", "b,2", "c,3"), ","), identity)
     RB> str(dfr)

     RB> #dfr$V2 <- as.numeric(dfr$V2)

     RB> So, if the op was about conversion to df, the answer is yes.

     RB> Rui Barradas

     RB> Em 30-08-2012 18:14, David Winsemius escreveu:
     >>
     >> On Aug 30, 2012, at 9:44 AM, Sam Steingold wrote:
     >>
     >>>> * 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.
     >>
     >> It is starting as a 'string' ('character' in R parlance) so you will
     >> need to coerce it to "numeric" at some point:
     >>
     >> Consider this alternate route:
     >>
     >> > do.call(rbind, strsplit(c("a,1","b,2","c,3"), ",") )
     >> [,1] [,2]
     >> [1,] "a"  "1"
     >> [2,] "b"  "2"
     >> [3,] "c"  "3"
     >> > as.data.frame( do.call(rbind, strsplit(c("a,1","b,2","c,3"), ",") ) )
     >> V1 V2
     >> 1  a  1
     >> 2  b  2
     >> 3  c  3
     >>
     >> > str( as.data.frame( do.call(rbind, strsplit(c("a,1","b,2","c,3"),
     >> ",") ) , stringsAsFactors=FALSE) )
     >> 'data.frame':    3 obs. of  2 variables:
     >> $ V1: chr  "a" "b" "c"
     >> $ V2: chr  "1" "2" "3"
     >>

     RB> ______________________________________________
     RB> R-help@r-project.org mailing list
     RB> https://stat.ethz.ch/mailman/listinfo/r-help
     RB> PLEASE do read the posting guide 
http://www.R-project.org/posting-guide.html
     RB> 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.

Reply via email to