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

17

我有一个很大的数据集(但以下是小的示例)。我可以将数据框拆分,然后想要将其输出到与用于拆分的标签相对应的多个文本文件中。

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) 
3个回答

17

使用lapply遍历spt1的名称将允许我们访问spt1中的数据框,并使用paste函数中可以用来创建文件的名称。

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

如果你想的话,你可以在粘贴时添加一个常见的扩展名。


11

您还可以使用非常快速的 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]

注意,这个答案使用的是仍处于开发版本的fwrite。如果需要安装,请转到此处查看安装说明。你可以简单地使用write.csv或者write.table,但是如果你正在处理大数据集,你可能需要一个快速的解决方案,而fwrite则是最快的替代品之一


2
也许值得注意的是:OP希望在输出中保留var1,但.SD不包含它。您可以尝试c(.BY, .SD)(不确定是否有效),或者使用新的split.data.table方法(目前在devel版本中https://github.com/Rdatatable/data.table/issues/1389)。 - Frank

0

Joseph Flanagan使用tidyverse和group_walk提供了一个非常优雅的答案

library(dplyr)
library(readr)

iris %>% 
  group_by(Species) %>% 
  group_walk(~ write_csv(.x, paste0(.y$Species, ".csv")))

注意:分组列本身不会被导出!如果您想保留分组列,请在最后一个闭括号之前添加.keep=TRUE - Christian T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接