2013-04-16 31 views
1

我对R很新,我需要你的帮助才能找出与非常耗时的过程相关的问题。太耗时的过程

我有一个非常大的数据集,我试图创建文件dat子集。我写的代码正在工作,但需要很长时间,我不知道如何让它更快。

下面是一段代码,我子集的数据集

df<-data.frame(a,b,c,d,e,f,g,h) 

mylist <- list() 

for(i in 1:(length(df$a))) { 
    mylist[[i]] <- subset(df, a==df$a[i]) 
    dep <- as.data.frame(mylist[i]) 
    SHYRMODY <- split(dep, data.frame(dep$a,dep$b, dep$c, dep$d), drop=TRUE) 
    lapply(names(SHYRMODY),function(x, SHYRMODY) 
    write.table(SHYRMODY[[x]], 
       paste(x, ".dat", sep = ""), 
       col.names=FALSE, 
       row.names=FALSE, 
       sep="\t", 
       quote=FALSE),SHYRMODY) 
} 
+1

请用英文描述你正在尝试做什么。我担心,优化什么是不正确的逻辑很可能不会为您提供任何服务。 –

+1

您的代码似乎正在写入大量文件:这些磁盘访问可能会降低您的代码速度。 –

+0

没有理由创建'dep',因为它只用于一行。只需在'split'调用中写入'data.frame(mylist [[i]] [,1:4])''。 –

回答

3

像这样:

mylist <- split(df, list(df$a, df$b, df$c, df$d), drop = TRUE) 
filenames <- paste0(names(mylist), ".dat") 

mapply(write.table, mylist, file = filenames, 
     col.names = FALSE, row.names = FALSE, sep = "\t", quote = FALSE) 

drop = TRUE选项,这样就不会为(a,b,c,d)组合创建空文件没有数据。

+0

非常感谢!这绝对是更快!使用R我仍然需要忘记循环.. – user2287387