2017-10-06 1 views
0

ディレクトリには780個のファイルがあり、78個の異なるファイルにRを使用して行をバインドし、ファイルごとに.txtを書き込む必要があります。ファイルの名前は、これらのようなものです:Rのデータテーブルとパターンマッチングのあるファイルのリスト

S1_S1_F1.xlsx 
S1_S2_F1.xlsx 
... 
S1_S5_F1.xlsx 
S1_S6_F2.xlsx 
... 
S1_S10_F2.xlsx 
S2_S1_F1.xlsx 

10回繰り返さS1_(.*).xlsx expresionの最初の部分は、その後、(.*)_S1(.*).xlsxから(.*)S10(.*).xlsxに変える第二部で、S78_(.*).xlsxまで変化します。私はS1.txtからS78.txtまでの78のファイルを持つために、第2期だけでファイルを結合する必要があります。

私のアプローチは、それが次のコードでファイルによってファイルやっていたので、私は、Rの専門家には程遠いです:あなたが見ることができるように

S1<-list.files(pattern = "^S1(.*).xlsx") 
S1<-lapply(S1,read_excel) 
S1 <- bind_rows(S1) 
write.table(S1, "S1.txt", sep="\t",row.names=FALSE) 

アップ

S78<-list.files(pattern = "^S78(.*).xlsx") 
S78 <-lapply(S78,read_excel) 
S78 <- bind_rows(S78) 
write.table(S78, "S1.txt", sep="\t",row.names=FALSE) 

へ、このコードはaustralopithecusによって書かれたようです(私はそうではありません)ので、私はあなたの助けを請う! forループでどうすればいいですか?

+0

どうしたらうまくいかないのですか?エラー?望ましくない結果はありますか? – Parfait

+0

@Parfaitそれは動作しますが、forループを使ってコードを改善し、10倍以上のファイルを別のディレクトリに適用したいだけです。それ以外の場合は、私は同じようにすべてをやり直します。 – jealcalat

答えて

0

単に意志出力の下には78に1のシーケンスを78個のTXTファイルを反復あなたのラインを中心に(ループで)別のlapplyをラップし、あなたに78個のデータフレームのリストを残す:

dfList <- lapply(seq(1,78), function(i) { 

    f <- list.files(pattern = paste0("^S", i, "(.*).xlsx")) 
    dfs <- lapply(f, read_excel)  
    df <- bind_rows(dfs)   # OR base R'S do.call(rbind, dfs) 
    write.table(df, paste0("S", i, ".txt"), sep="\t", row.names=FALSE) 

    return(df) 
}) 

dfList[[1]] 
dfList[[2]] 
... 
dfList[[78]] 

そして、 sapplyを使って名前付きリストを返すこともできます:

dfList <- sapply(paste0("S",seq(1,78)), function(i) { 

    f <- list.files(pattern = paste0("^", i, "(.*).xlsx")) 
    dfs <- lapply(f, read_excel) 
    df <- bind_rows(dfs) 
    write.table(df, paste0(i, ".txt"), sep="\t", row.names=FALSE) 

    return(df) 
}, simplify = FALSE) 

dfList$S1 
dfList$S2 
... 
dfList$S78 
+0

それは完璧に働いた!ありがとうございました! – jealcalat

+0

素晴らしい!私はあなたが永遠に消えたと思った。私たちは回答者がOPのために私たちの呼吸をします。 StackOverflowの方法を忘れないでください[感謝](https://meta.stackexchange.com/a/5235)! – Parfait

関連する問題