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