2012-04-03 28 views
11

Büyük veri kümem var (ancak aşağıdaki örnek küçüktür). Veri çerçevesini bölebilir ve daha sonra bölmek için kullanılan lavel'e karşılık gelen çoklu metin dosyasına çıkış yapmak istiyorum. Veri dosyalarını birden çok çıktı dosyasına bölme

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 

Şimdi outputc, outputk ve outputl adına write.table istiyorum
> 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 

bölün. Böylece çıktı, ortak önek ve ardından değişken gruplama için etiketin adıdır. spt1 adlarının üzerine lapply kullanma

write.table (spt1) 

cevap

12

bize spt1 içinde dataframes ve bizim dosyaları oluşturmak için macun kullanabilecekleri adını erişmesine izin verir. İsterseniz

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

Sen macun ortak bir uzantısı ekleyebilir.

5

Gerçekten hızlı bir data.table çözümü de kullanabilirsiniz. Bu durumda, dataframe'u list'a bölmeye gerek yoktur. durumda

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] 

çıktıda var1 tutmak istiyorum, bunu yapabilirsiniz:

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

ps. Bu cevabın hala data.table geliştirme sürümünde olan fwrite kullandığını unutmayın. Go here for install instructions. write.csv veya write.table'u kullanabilirsiniz, ancak büyük bir veri kümesiyle uğraşmanızın ve fwrite'un kesinlikle one of the fastest alternatives olduğu durumlarda hızlı bir çözüm isteyebilirsiniz.

+1

Belki de dikkat çekmeye değer: OP çıktıdaki var1'i korumak istiyor ama '.SD' içermiyor. C (.BY, .SD) 'yi (eğer işe yarayıp yaramadığından emin değilseniz) ya da yeni' split.data.table' yöntemini (şu anda https://github.com/Rdatatable/data versiyon sürümünde) kullanabilirsiniz. table/issues/1389) – Frank

İlgili konular