2013-03-02 14 views
7

Takılıyorum. Bir dizindeki bir grup alt klasörde yineleme, 4 .csv dosyalarını dışarı çekme, bu 4 .csv dosyasının içeriğini bağlama, sonra yeni .csv'yi ilk alt klasörün adını kullanarak yeni bir dizine yazmanın bir yoluna ihtiyacım var. yeni .csv adı olarak.Alt klasörler arasında yinelemek ve aynı kimliğe ait CSV dosyalarını bağlamak için R nasıl kullanılır?

Bunu yapabilirim. Ama alt klasörlerde yineleme ve csv dosyalarını birbirine nasıl bağlayacağım. Benim engelim, her bir alt klasörün aynı 8 basamaklı kimliği kullanarak aynı 4 .csv dosyalarını içermesidir. Örneğin, alt klasör A 09061234.csv, 09061345.csv, 09061456.csv ve 09061560.csv içerir. alt klasör B 9061234.csv, 09061345.csv, 09061456.csv ve 09061560.csv içerir. (...). Aynı isimde 42 alt klasör ve dolayısıyla 168 csv dosyası var. Dosyaları aşağıya sıkıştırmak istiyorum 42

Tüm alt klasörleri almak için list.files'u kullanabilirim. Ama sonra ne olacak?

##Get Files from directory 
TF = "H:/working/TC/TMS/Counts/June09" 
##List Sub folders 
SF <- list.files(TF) 
##List of File names inside folders 
FN <- list.files(SF) 
#Returns list of 168 filenames 

###?????### 
#How to iterate through each subfolder, read each 8-digit integer id file, 
#bind them all together into one single csv, 
#Then write to new directory using 
#the name of the subfolder as the name of the new csv? 

Orada kolaylıkla bunu yapmanın bir yolu muhtemelen ama ben R. şey işlevlerini paste ve belki write.table karıştığı bir çaylak değilim? Herhangi bir ipucu/yardım/öneri çok takdir edilmektedir. Teşekkürler!

cevap

12

Sen agstudy kodunun bazı verdiği sonra list.files için recursive=T seçeneği,

lapply(c('1234' ,'1345','1456','1560'),function(x){ 
    sources.files <- list.files(path=TF, 
           recursive=T, 
           pattern=paste('*09061*',x,'*.csv',sep='') 
           ,full.names=T) 
     ## ou read all files with the id and bind them 
     dat <- do.call(rbind,lapply(sources.files,read.csv)) 
     ### write the file for the 
     write(dat,paste('agg',x,'.csv',sep='') 
    } 
+0

çok teşekkürler @agstudy! – myClone

1

kullanabilirsiniz, ben sonuçta sonra oldu çözüm geldi. Benim özel problemimin doğasından daha çok eksik parça vardı, bu yüzden agstudy'nin cevabını "kabul edildi" olarak bırakıyorum.

Gerçekten gerekli olmayan bir işlevi kapatır. En azından şimdilik değil. Aynı görevi tekrar yapmam gerekirse, bunun dışında bir işlev oluşturacağım. Şimdilik bu problemi onsuz çözebilirim.

Ayrıca, benim örneğimde alt klasörlerde yaşamış olabilecek tüm csv dosyalarını işlemek için koşullu bir "if" ifadesine ihtiyacım vardı. Bir if ifadesi ekleyerek, R uyarıları atar ve virgülle ayrılmış olmayan dosyaları atlar.
Kodu:

##Define directory path## 
TF = "H:/working/TC/TMS/Counts/June09" 
##List of subfolder files where file name starts with "0906"## 
SF <- list.files(TF,recursive=T, pattern=paste("*09061*",x,'*.csv',sep="")) 
##Define the list of files to search for## 
x <- (c('1234' ,'1345','1456','1560') 
##Create a conditional to skip over the non-csv files in each folder## 
if (is.integer(x)){ 
    sources.files <- list.files(TF, recursive=T,full.names=T)} 

dat <- do.call(rbind,lapply(sources.files,read.csv)) 
#the warnings thrown are ok--these are generated due to the fact that some of the folders contain .xls files 
write.table(dat,file="H:/working/TC/TMS/June09Output/June09Batched.csv",row.names=FALSE,sep=",") 
İlgili konular