2016-11-23 3 views
0

異なるフォルダのデータをマージしたい。したがって、私はまず現在の作業ディレクトリ(list.dirs()を使って)にすべてのマップ名を持つオブジェクトを作成します。その後、特定のファイル名(私のパターン)をすべてのマップで調べます。 問題は、ファイルにこの特定の文字列が含まれていない場合、list.files()がエラーを返すことです。list.files()は、Rにパターンを含まないパスを無視できますか?

(Error in file(file, "rt") : cannot open the connection In addition: Warning message: In file(file, "rt") : cannot open file 'NA': No such file or directory). 

パターンを含むことがわかっているマップのみを選択すると、コードが機能します。

誰かがlist.files()に特定のパターンを含まないパスを無視する方法を知っていますか?

これは私のコードです:

GS.dir<- list.dirs(path = ".", recursive = TRUE) 
ligustrum <- c() 

    for (j in 1:length(GS.dir)){   
     files <- list.files(GS.dir[j], pattern = glob2rx("li*Avg.txt"), full.names = TRUE) 
     if(!is.null(files)){ 
      for (i in 1:length(files)){ 
       plot <- read.table(files[i], header = TRUE, sep = ",") 
       datum <- substr(files[i], 1, 8) 
       nummer <- substr(files[i], nchar(files[i]) - 7, nchar(files[i]) - 7) 
       plot.date <- data.frame("Date" = rep(datum, length(plot[,1])), 
             "plotnr"=rep(nummer,length(plot[,1])), 
             plot 
             ) 
       ligustrum <- rbind(ligustrum, plot.date) 
      } 
     } else { 
      ligustrum <- ligustrum 
     } 
    } 

    write.table(ligustrum, "ligustrum.txt", sep = ";", row.names = FALSE) 
+0

はあなたのコードが失敗した時に、特定のポイントを調査したことがありますか? 'for'ループでは、それらを実行して失敗させ、入力値が何であるかを調べることができます(あなたの場合は' j'と 'i')。これらの入力を使用して、コードの各ステップを実行して、どこにどのように障害が発生しているかを確認します。 – rosscova

+0

"文字列なし"を扱うには2つの方法があります。これをテストし、何らかの理由でそれを回避または処理する 'if'関数を使用するか、' tryCatch'を使用してエラーをキャッチして処理します。この方法では、実行は停止せず、関数はさらに実行されます。 –

答えて

0

GS.dir<- list.dirs(path = ".", recursive = TRUE)リスト"."下のすべてのファイル。 list.files()に再度電話すると、スクリプトは多くの不必要な作業を行います。たとえば、list.files("./mydir/subdir/subsubdir/file.txt")character(0)を返します。私の意見では、コードの最初の行に必要なものはすべてすでに用意されています。

GS.files <- list.dirs(path = ".", recursive = TRUE) 
files <- GS.files[grepl("li*Avg.txt", GS.files)] 

を、その後、それはdplyrまたは代わりに、ネストされたループのdata.tableで仕事を得るために、おそらく簡単です:そして、あなたは自分のregExprのことでパスのこのベクトルをサブセットすることができます。

[UPD]

require(dplyr) 

data.frame(files = list.files(recursive = T)) %>% 
     filter(grepl("li(.)*Avg.txt",files)) %>% 
     mutate(files = as.character(files)) %>% 
     group_by(files) %>% 
     mutate(datum = substr(substr(files, 
            max(gregexpr("/",files)[[1]])+1, 
            nchar(files) 
            ), 1, 8), 
       nummer = substr(files, nchar(files) - 7, nchar(files) - 7)) %>% 
     do(data.frame(datum = as.Date(.$datum, format = "%Y%m%d"), 
         nummer = as.numeric(.$nummer), 
         read.table(.$files, T))) %>% 
     arrange(datum, nummer, files) %>% 
     write.table(.,file = "ligstrum.txt", sep = ";", row.names = F) 
+0

したがって、 'files < - list.files(GS.dir [j]、pattern = glob2rx( "li * Avg.txt")、full.names = TRUE)'の代わりに 'files < - GS.dir [grepl( "li * Avg.txt")、GS.dir)] ' これは不幸にもエラーを解決しません –

+0

私は後者の例を再現しようとします。私はそれが動作するかどうかを知っています。 – utubun

+0

@JolienBracke私は答えを更新しました。 – utubun

関連する問題