2012-04-03 29 views
11

Tôi có tập dữ liệu lớn (nhưng sau đây là tập dữ liệu nhỏ). Tôi có thể chia dataframe và sau đó tôi muốn xuất ra nhiều tập tin văn bản tương ứng với lavel được sử dụng để chia nhỏ.Chia khung dữ liệu thành nhiều tệp đầu ra

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 

Bây giờ chia

> 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 

Tôi muốn write.table trong tên của outputc, outputk, và outputl. Vì vậy, đầu ra là tiền tố phổ biến, theo sau là tên của nhãn để nhóm biến.

write.table (spt1) 

Trả lời

12

Sử dụng lapply qua tên spt1 sẽ cho phép chúng tôi truy cập vào các khung dữ liệu trong spt1 và tên chúng tôi có thể sử dụng để dán để tạo tệp.

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

Bạn có thể thêm phần mở rộng chung vào hình dán nếu muốn.

5

Bạn cũng có thể sử dụng giải pháp data.table thực sự nhanh. Trong trường hợp này, không cần phải tách dataframe thành 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] 

Trong trường hợp bạn muốn giữ var1 trong đầu ra, bạn có thể làm điều này:

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

ps. lưu ý rằng câu trả lời này sử dụng fwrite, vẫn còn trong phiên bản phát triển của data.table. Go here for install instructions. Bạn chỉ có thể sử dụng write.csv hoặc write.table, tuy nhiên bạn có thể muốn có giải pháp nhanh trong trường hợp bạn đang xử lý một tập dữ liệu lớn và fwrite chắc chắn là one of the fastest alternatives.

+1

Cũng có thể đáng chú ý: OP muốn giữ lại 'var1' ở đầu ra nhưng' .SD' không chứa nó. Bạn có thể thử 'c (.BY, .SD)' (không chắc chắn nếu nó hoạt động) hay sử dụng phương thức 'split.data.table' mới (hiện đang có trong phiên bản devel https://github.com/Rdatatable/data. bảng/vấn đề/1389) – Frank

Các vấn đề liên quan