将 Dataframe 拆分为多个输出文件

cotxawn7  于 2023-05-04  发布在  其他
关注(0)|答案(3)|浏览(160)

我有一个大的数据集(但下面是一个小的例子)。我可以拆分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

现在分开

> 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

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

write.table (spt1)
lsmepo6l

lsmepo6l1#

在spt1的名称上使用lapply将允许我们访问spt1中的 Dataframe 以及可以在paste中使用的名称来创建文件。

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

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

k0pti3hp

k0pti3hp2#

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

kadbb459

kadbb4593#

Joseph Flanagan使用tidyverse和group_walk提供了一个very elegant answer

library(dplyr)
library(readr)

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

相关问题