8

ハマった。ディレクトリ内の一連のサブフォルダーを反復処理し、4 つの .csv ファイルを取り出し、それらの 4 つの .csv ファイルの内容をバインドしてから、最初のサブフォルダーの名前を使用して新しい .csv を新しいディレクトリに書き出す方法が必要です新しい .csv の名前として。

私はRがこれを行うことができることを知っています. しかし、サブフォルダー間で反復処理を行い、csv ファイルをバインドする方法に行き詰まっています。私の障害は、各サブフォルダーに同じ 8 桁の ID を使用する同じ 4 つの .csv ファイルが含まれていることです。たとえば、サブフォルダー A には、09061234.csv、09061345.csv、09061456.csv、および 09061560.csv が含まれています。サブフォルダー B には、9061234.csv、09061345.csv、09061456.csv、および 09061560.csv が含まれています。(...)。42 個のサブフォルダーがあるため、同じ名前の 168 個の csv ファイルがあります。ファイルを 42 個まで圧縮したい。

list.filesすべてのサブフォルダーを取得するために使用できます。しかし、その後は?

##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?

おそらくこれを簡単に行う方法がありますが、私はRの初心者です。関数を含む何か、pasteそしてwrite.tableおそらく?ヒント/ヘルプ/提案は大歓迎です。ありがとう!

4

2 に答える 2

15

、のrecursive=Tオプションを使用できますlist.files

 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='')
   }
于 2013-03-02T01:07:58.300 に答える
2

agstudy のコードを微調整した後、最終的に求めていたソリューションにたどり着きました。私の特定の問題の性質に起因する欠落している部分がいくつかあったため、agstudyの回答を「受け入れた」ままにしています。

関数は本当に必要ないことがわかりました。少なくとも今のところは。この同じタスクをもう一度実行する必要がある場合は、そこから関数を作成します。今のところ、これなしでこの特定の問題を解決できます。

また、私の例では、サブフォルダーに存在する可能性のある csv 以外のファイルを処理するために、条件付きの "if" ステートメントが必要でした。if ステートメントを追加することにより、R は警告をスローし、コンマで区切られていないファイルをスキップします。
コード:

##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=",")
于 2013-03-04T22:52:59.823 に答える