2012-04-03 23 views
11

Mam duży zbiór danych (ale na przykład mały). Mogę podzielić ramkę danych, a następnie chcę wypisać na wiele plików tekstowych odpowiadających podziałowi używanemu do podziału.Podział ramek danych na wiele plików wyjściowych

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 

Teraz podzielić

> 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 

Chcę write.table w imieniu outputc, outputk i outputl. Zatem wyjście jest wspólnym przedrostkiem, po którym następuje nazwa etykiety dla zmiennej grupującej.

write.table (spt1) 

Odpowiedz

12

Korzystanie lapply nad nazwiskami spt1 pozwoli nam przejść do dataframes w spt1 i nazwisko, które możemy wykorzystać w paście do tworzenia nasze pliki.

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

Jeśli chcesz, możesz dodać wspólne rozszerzenie.

5

Można również użyć naprawdę szybkiego rozwiązania data.table. W takim przypadku nie ma potrzeby podziału dataframe na 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] 

W przypadku, gdy chcesz zachować var1 na wyjściu, można to zrobić:

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

ps. zauważ, że ta odpowiedź używa fwrite, która wciąż znajduje się w wersji rozwojowej data.table. Go here for install instructions. Możesz po prostu użyć write.csv lub write.table, jednak prawdopodobnie będziesz potrzebować szybkiego rozwiązania w przypadku, gdy masz do czynienia z dużym zbiorem danych, a fwrite z pewnością jest one of the fastest alternatives.

+1

Być może warto również zauważyć: OP chce zachować 'var1' na wyjściu, ale' .SD' go nie zawiera. Możesz spróbować 'c (.BY, .SD)' (nie wiem, czy to działa) lub użyć nowej metody 'split.data.table' (obecnie w wersji devel https://github.com/Rdatatable/data. tabela/numery/1389) – Frank

Powiązane problemy