将数据帧拆分为多个输出文件

jon*_*jon 12 split r dataframe

我有大数据集(但例如以下是小数据集).我可以拆分数据帧然后我想输出到与用于拆分的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
Run Code Online (Sandbox Code Playgroud)

现在拆分了

> 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
Run Code Online (Sandbox Code Playgroud)

我想的名字write.table outputc,outputkoutputl.因此,输出是公共前缀,后跟分组变量的标签名称.

write.table (spt1) 
Run Code Online (Sandbox Code Playgroud)

Das*_*son 14

在spt1的名称上使用lapply将允许我们访问spt1中的数据帧以及我们可以在粘贴中使用的名称来创建我们的文件.

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

如果需要,您可以在粘贴中添加公共扩展名.


raf*_*ira 9

您还可以使用非常快速的data.table解决方案.在这种情况下,不需要将其拆分dataframe为a 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]
Run Code Online (Sandbox Code Playgroud)

如果您想保留var1输出,可以这样做:

mydata[, fwrite(copy(.SD)[, var1 := var1] paste0("output", var1,".csv")), by = var1]
Run Code Online (Sandbox Code Playgroud)

PS.请注意,这个答案使用fwrite,仍然在开发版本中data.table.转到此处获取安装说明.你可以简单地使用write.csv或者write.table,但是你可能想要一个快速的解决方案,以防你处理大数据集,fwrite并且肯定是最快的替代方案之一.

  • 也许还值得注意:OP 希望在输出中保留“var1”,但“.SD”不包含它。您可以尝试“c(.BY, .SD)”(不确定是否有效)或使用新的“split.data.table”方法(目前在开发版本中 https://github.com/Rdatatable/data。表/问题/1389) (2认同)