【问题标题】:Split dataframe into multiple output files将数据框拆分为多个输出文件
【发布时间】:2021-12-22 14:50:46
【问题描述】:

我有大数据集(但以下是小数据集)。我可以拆分数据框,然后我想输出到与用于拆分的 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 的名义编写.table。因此输出是公共前缀,后跟用于分组变量的标签名称。

write.table (spt1) 

【问题讨论】:

    标签: r split dataframe


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 也许还值得注意:OP希望在输出中保留var1,但.SD不包含它。您可以尝试c(.BY, .SD)(不确定是否有效)或使用新的split.data.table 方法(目前处于开发版本github.com/Rdatatable/data.table/issues/1389
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多