2012-04-03 54 views
11

我有大数据集(但以下是小例子)。我可以拆分数据框,然后我想输出到多个文本文件对应的lavel用于分割。将数据帧拆分为多个输出文件

mydata <- data.frame (var1 = rep(c("k", "l", "c"), each = 5), var2 = rnorm(5), 
     var3 = rnorm(5)) 
mydata  
    var1  var2  var3 
1  k 0.5406022 0.3654706 
2  k -0.6356879 -0.9160001 
3  k 0.2946240 -0.1072241 
4  k -0.2609121 0.1036626 
5  k 0.6206579 0.6111655 
6  l 0.5406022 0.3654706 
7  l -0.6356879 -0.9160001 
8  l 0.2946240 -0.1072241 
9  l -0.2609121 0.1036626 
10 l 0.6206579 0.6111655 
11 c 0.5406022 0.3654706 
12 c -0.6356879 -0.9160001 
13 c 0.2946240 -0.1072241 
14 c -0.2609121 0.1036626 
15 c 0.6206579 0.6111655 

现在拆分

> spt1 <- split(mydata, mydata$var1) 

> spt1 

$c 
    var1  var2  var3 
11 c 0.5406022 0.3654706 
12 c -0.6356879 -0.9160001 
13 c 0.2946240 -0.1072241 
14 c -0.2609121 0.1036626 
15 c 0.6206579 0.6111655 

$k 
    var1  var2  var3 
1 k 0.5406022 0.3654706 
2 k -0.6356879 -0.9160001 
3 k 0.2946240 -0.1072241 
4 k -0.2609121 0.1036626 
5 k 0.6206579 0.6111655 

$l 
    var1  var2  var3 
6  l 0.5406022 0.3654706 
7  l -0.6356879 -0.9160001 
8  l 0.2946240 -0.1072241 
9  l -0.2609121 0.1036626 
10 l 0.6206579 0.6111655 

我想在outputcoutputkoutputl名write.table。因此,输出是通用前缀,后跟分组变量的标签名称。

write.table (spt1) 

回答

12

在SPT1的名字lapply使用将使我们能够访问SPT1的dataframes而且我们可以在贴用它来创建我们的文件名。

lapply(names(spt1), function(x){write.table(spt1[[x]], file = paste("output", x, sep = ""))}) 

如果需要,您可以在粘贴中添加常用扩展名。

5

您还可以使用非常快的data.table解决方案。在这种情况下,不需要将dataframe拆分为list

library(data.table) # v1.9.7 (devel version) 

setDT(mydata) # convert your dataframe into a data.table 

# save files 
    mydata[, fwrite(.SD, paste0("output", var1,".csv")), by = var1] 

如果你想保持var1输出,你可以这样做:

mydata[, fwrite(copy(.SD)[, var1 := var1] paste0("output", var1,".csv")), by = var1] 

PS。请注意,此答案使用fwrite,它仍处于data.table的开发版本中。 Go here for install instructions。您可以简单地使用write.csvwrite.table,但是如果您正在处理大数据集,您可能需要快速解决方案,fwrite肯定是one of the fastest alternatives

+1

也许值得注意的是:OP想要在输出中保留'var1',但'.SD'不包含它。你可以尝试'c(.BY,.SD)'(不知道这是否有效)或者使用新的'split.data.table'方法(目前在devel版本https://github.com/Rdatatable/data中。表/问题/ 1389) – Frank 2016-05-19 16:07:06