HENRIKSON, JEFFREY
2004-Aug-16 17:33 UTC
[R] turning off automatic coersion from list to matrix
Hello, I am having trouble understanding how R is coercing between matrices and lists in the following example. I have an aggregate behavior I like: aggregate(a[,"num"],by=list(product=a[,"product"],region=a[,"region"]), sum) Now in reality I have more columns than just product and region, and need to pick different combinations. So I want to abstract this into a function. Example use: myagg(a,c("product","region")) But I am having trouble because by= requires a list and apply and sapply seem to cast things back to the "matrix" type automatically. Can I turn this off? Eg: data.class(sapply(c("product","region"),function(i) {a[,i]})) [1] "matrix" whereas this would be acceptable to by data.class(list(product=a[,"product"],region=a[,"region"])) [1] "list" Regards, Jeff Henrikson
Gabor Grothendieck
2004-Aug-17 05:16 UTC
[R] turning off automatic coersion from list to matrix
HENRIKSON, JEFFREY <JEFHEN <at> SAFECO.com> writes: : : Hello, : : I am having trouble understanding how R is coercing between matrices and : lists in the following example. I have an aggregate behavior I like: : : aggregate(a[,"num"],by=list(product=a[,"product"],region=a[,"region"]), : sum) : : Now in reality I have more columns than just product and region, and : need to pick different combinations. So I want to abstract this into a : function. Example use: : : myagg(a,c("product","region")) : : But I am having trouble because by= requires a list and apply and sapply : seem to cast things back to the "matrix" type automatically. Can I turn : this off? Eg: : : data.class(sapply(c("product","region"),function(i) {a[,i]})) : [1] "matrix" : : whereas this would be acceptable to by: : data.class(list(product=a[,"product"],region=a[,"region"])) : [1] "list" I think you are looking for lapply but, actually, its even easier. Note that a data frame is *already* a list thus you can do things like this: data(warpbreaks) aggregate(warpbreaks[,"breaks",drop=F], warpbreaks[,c("wool","tension")], mean) or you can use numeric indices like this: aggregate(warpbreaks[,1,drop=FALSE], warpbreaks[,2:3], mean)