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"
--
David Winsemius, MD
Alameda, CA, USA
______________________________________________
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.