2012-04-03 3 views
11

У меня есть большой набор данных (но, к примеру, следующий небольшой). Я могу разделить DataFrame, а затем я хочу, чтобы вывести на несколько текстовых файлов, соответствующих Lavel, используемых для разделения.Сплит dataframe в несколько выходных файлов

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 

Я хочу write.table в имени outputc, outputk и outputl. Таким образом, выход является общим префиксом, за которым следует имя метки для группировки переменной.

write.table (spt1) 

ответ

12

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

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

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

5

Вы также можете использовать действительно быстрое решение 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, который все еще находится в версии разработки data.table. Go here for install instructions. Вы можете просто использовать write.csv или write.table, однако вы, вероятно, захотите быстрого решения на тот случай, если вы имеете дело с большим набором данных, а fwrite - это, безусловно, one of the fastest alternatives.

+1

Возможно, также стоит отметить: OP хочет сохранить 'var1' в выходе, но' .SD' его не содержит. Вы можете попробовать 'c (.BY, .SD)' (не уверен, что это работает) или использовать новый метод split.data.table (в настоящее время в версии devel https://github.com/Rdatatable/data. стол/вопросы/1389) – Frank

Смежные вопросы