2017-08-24 5 views
0

複数の.csvファイルをデスクトップのフォルダから読み込み、これらの.csvファイルをすべて1つのdata.frameにマージし、各ファイルの名前を含む列を作成します。複数の.csvファイルを読み込み、マージして新しい列を作成するにはどうすればよいですか?

私が試してみました:

my.path <- "C:/Users/JB/Desktop/RawFiles/" 
filenames <- paste(my.path, list.files(path=my.path), sep="/") 
my.df <- do.call(rbind, lapply(filenames, function(x) cbind(read.csv(x), name=strsplit(x,'\\.')[[1]][1]))) 

しかし、my.dt$nameは.CSVのファイル名が含まれていません。むしろ、ファイルの場所を含んでいます。例えば、head(my.dt, 3)が生成する:

name 
1 C:/Users/JB/Desktop/RawFiles//Analysis_01122016 
2 C:/Users/JB/Desktop/RawFiles//Analysis_01122016 
3 C:/Users/JB/Desktop/RawFiles//Analysis_01122016 

にはどうすればmy.dt$nameだけfile.nameを生産するので、これを編集することができますか?私の予想される出力は:

name 
    1 Analysis_01122016 
    2 Analysis_01122016 
    3 Analysis_01122016 

ありがとう!

+1

'strplitは' .'で分割され、最初の部分をとっています。だからこそ、拡張子を削除することです(ファイル名にピリオドがある場合はそれ以上)。 – lebelinoz

+1

また、あなたの 'sep ="/"'は余分なスラッシュを追加しているようです。 – lebelinoz

答えて

1

まず、パスに変数を使用する必要はありません。 full.names = TRUEの引数はlist.filesになります。

あなただけのファイル名と拡張子をしたい場合は、あなたが使用することができます。

basename("full/path/to/myfile.csv") 

あなたも拡張子を削除する場合:

tools::file_path_sans_ext(basename("full/path/to/myfile.csv")) 

をですから、あなたにこのような何かを行うことができますコード:

filenames <- list.files(path = "C:/Users/JB/Desktop/RawFiles", full.names = TRUE) 
my.df <- do.call(rbind, 
       lapply(filenames, function(x) 
            cbind(read.csv(x), 
            name = tools::file_path_sans_ext(basename(x))))) 

ただし、plyr::ldplyなどのツールを使用するクリーナーソリューションがあります。 data.tableとすると、適切な検索で他の回答の例が見つかります。

0

"/"のファイルパスをstrsplit()で分割し、結果のベクトルの最後の要素を取得することができます。

files <- list.files("~/Dropbox/structure_simulations/str_in/k2",full.names = T) 

df <- lapply(files,function(e) { 
    tmp <- read.csv(e) 
    name <- unlist(strsplit(e,"/"))[length(unlist(strsplit(e,"/")))] 
    name <- unlist(strsplit(name,"\\."))[1] 
    tmp$name <- name 
    tmp 
    }) 
df <- do.call(rbind,df) 
関連する問題