2012-04-03 2 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 

지금 내가 outputc, outputkoutputl의 이름으로 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의 dataframes 우리는 우리의 파일을 만들 페이스트에 사용할 수있는 이름에 액세스 할 수 있습니다.

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] 

추신. 이 대답은 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

관련 문제