[Rd] split() is slow on data.frame (PR#14123)

William Dunlap wdunlap at tibco.com
Wed Dec 9 23:26:15 CET 2009


Here are some differences between the current and proposed
split.data.frame.

> d<-data.frame(Matrix=I(matrix(1:10, ncol=2)),
Named=c(one=1,two=2,three=3,four=4,five=5),
row.names=as.character(1001:1005))
> group<-c("A","B","A","A","B")
> split.data.frame(d,group)
$A
     Matrix.1 Matrix.2 Named
1001        1        6     1
1003        3        8     3
1004        4        9     4

$B
     Matrix.1 Matrix.2 Named
1002        2        7     2
1005        5       10     5

> mysplit.data.frame(d,group) # lost row.names and 2nd column of Matrix
[1] "processing data.frame"
$A
     Matrix Named
[1,]      1     1
[2,]      3     3
[3,]      4     4

$B
     Matrix Named
[1,]      2     2
[2,]      5     5


Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com  

> -----Original Message-----
> From: r-devel-bounces at r-project.org 
> [mailto:r-devel-bounces at r-project.org] On Behalf Of 
> pengyu.ut at gmail.com
> Sent: Wednesday, December 09, 2009 2:10 PM
> To: r-devel at stat.math.ethz.ch
> Cc: R-bugs at r-project.org
> Subject: [Rd] split() is slow on data.frame (PR#14123)
> 
> Please see the following code for the runtime comparison between
> split() and mysplit.data.frame() (they do the same thing
> semantically). mysplit.data.frame() is a fix of split() in term of
> performance. Could somebody include this fix (with possible checking
> for corner cases) in future version of R and let me know the inclusion
> of the fix?
> 
> m=300000
> n=6
> k=30000
> 
> set.seed(0)
> x=replicate(n,rnorm(m))
> f=sample(1:k, size=m, replace=T)
> 
> mysplit.data.frame<-function(x,f) {
>   print('processing data.frame')
>   v=lapply(
>       1:dim(x)[[2]]
>       , function(i) {
>         split(x[,i],f)
>       }
>       )
> 
>   w=lapply(
>       seq(along=v[[1]])
>       , function(i) {
>         result=do.call(
>             cbind
>             , lapply(v,
>                 function(vj) {
>                   vj[[i]]
>                 }
>                 )
>             )
>         colnames(result)=colnames(x)
>         return(result)
>       }
>       )
>   names(w)=names(v[[1]])
>   return(w)
> }
> 
> system.time(split(as.data.frame(x),f))
> system.time(mysplit.data.frame(as.data.frame(x),f))
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 



More information about the R-devel mailing list