Разделить фрейм данных на несколько выходных файлов

У меня есть большой набор данных (но, к примеру, ниже). Я могу разделить 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 в имени outputc, outputk и outputl. Таким образом, выход является общим префиксом, за которым следует имя метки для группировки переменной.

write.table (spt1) 

Ответ 1

Использование lapply над именами spt1 позволит нам получить доступ к фреймам данных в spt1 и имени, которое мы можем использовать в папке для создания наших файлов.

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

Вы можете добавить общее расширение в пасте, если хотите.

Ответ 2

Вы также можете использовать действительно быстрое решение 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]

Если вы хотите сохранить var1 в выводе, вы можете сделать это:

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

пс. обратите внимание, что в этом ответе используется fwrite, который все еще находится в версии разработки data.table. Перейдите сюда для инструкций по установке. Вы можете просто использовать write.csv или write.table, однако вам, вероятно, нужно быстрое решение, если вы имеете дело с большим набором данных, а fwrite, безусловно, является одной из самых быстрых альтернатив.