2012-04-03 12 views
11

私は大きなデータセットを持っています(しかし、以下は小さなものです)。私は、データフレームを分割することができますし、私は分割に使用される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 

は、今私はoutputcoutputk、およびoutputlの名前にはwrite.tableしたい

> 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 

を分割します。したがって、出力は一般的な接頭辞の後に変数をグループ化するためのラベルの名前が続きます。 SPT1の名前の上にlapply使用

write.table (spt1) 

答えて

12

は、私たちは私たちがファイルを作成するためにペーストに使用することができますSPT1におけるデータフレームと名前をアクセスできるようになります。

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

必要に応じてペーストに共通の拡張子を追加できます。

5

また、実際には高速のdata.tableソリューションを使用することもできます。この場合、dataframelistに分割する必要はありません。

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 instructionswrite.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にあります)。テーブル/ issue/1389) – Frank

関連する問題