2017-05-02 13 views
0

私はプログラミングに慣れていない。 Rの異なるディレクトリから2つのテーブル/ファイルを結合しようとします。プログラムは、両方のディレクトリのフォルダを並列にループして、1つのファイルを別のファイルに読み込む必要があります。次に、ループしているフォルダからの2つの現在の.csvファイルを結合する必要があります。 残念ながら、1つのファイルから別のファイルに列を手動でコピーするにはファイルが多すぎます。R:異なるディレクトリにあるループファイルから2つのテーブルを結合する

ソースディレクトリとファイルは、以下のようになります。

filepath1:D:/ Test1を/

ファイル名:A1、A2、A3、A4、...

filepath2:D:/ Test2を/

ファイル名:B1、B2、B3、B4 ,. ..

これにより、A1とB1は1つの共通の列に基づいて結合されます。

次に、A2とB2を結合する必要があります。その後、A3とB3など

基本的に、手動で選択した2つの特定のファイルにcbind、merge、またはjoin関数を使用すると、うまく動作します。私は、フォルダのTest1をループに試してみて、そのフォルダにTest2の上に、私はdata.framesのリストを取得すると

library(readr) 
library(dplyr) 
A1 <- read.csv("D:/Test1/A1.csv") 
B1 <- read.csv("D:/Test2/B1.csv") 
mydata = inner_join(A1, B1, by="micrometer") 

:私は、次のコードを使用していました。次に、それらを結合すると、関数 "inner_join"をクラス "list" "のオブジェクトに適用できないというエラーが発生します。

library(rio) 
require(data.table) 

setwd("D:/Test1/") 

file <- dir(pattern ="*.csv") 
    for (k in 1:length(listcsv)) { 
     ldf[[k]] <- read.csv(listcsv[k]) 
    } 
data.files = list.files(pattern = "*.csv") 
mydata1 <- lapply(file, read.csv) 

setwd("D:/Test2/") 

file2 <- dir(pattern ="*.csv") 
    for (j in 1:length(listcsv)) { 
     ldf[[j]] <- read.csv(listcsv[j]) 
    } 
data.files2 = list.files(pattern = "*.csv") 
mydata2 <- lapply(file2, read.csv) 

myfulldata = inner_join(mydata1, mydata2, by="micrometer") 

間違いを見つけてもらえますか?

答えて

1

この行までのコードは正しいです。

myfulldata = inner_join(mydata1, mydata2, by="micrometer") 

data.framesのリストでinner_joinを呼び出そうとしています。あなたはほぼ正しいです。新しいforループを作成する場合:

myfulldata = list(length(mydata1)) 
for (i in 1:length(mydata1)) { 
    myfulldata[[i]] = inner_join(mydata1[[i]], mydata2[[i]], by = "micrometer") 
} 

これはうまくいくはずです。 mapply

myfulldata = mapply(inner_join, mydata1, mydata2, MoreArgs=list(by = "micrometer")) 

これははるかにコンパクトで優れたRスタイルです。

+0

素晴らしい!どうもありがとう!これは、マッパリと完全に動作します。 – Donkey19

+0

@ Donkey19素晴らしいあなたは答えを受け入れることができますか? – MentatOfDune

関連する問題