ケィオスの時系列解析メモランダム

時系列解析、生体情報解析などをやわらかく語ります

【Rでデータ解析】複数フォルダに含まれる,目的のファイルへのパスを抽出する

最近は,生体時系列の解析ニーズが高まっていると感じます.Fitbitで計測されたデータの分析を頼まれることも多いです.

今回は,個人ごとにフォルダが分けられているような場合に,分析したい目的のファイルへのパスを抽出する方法を紹介します. 分析に使うのは,Rです.

目的のファイル名が固定のとき

以下のフォルダ構造のように,ID_01,ID_02などのフォルダがあり,各フォルダの中に,heart_rate.csvが存在する場合を考えます.

DIR
├── ID_01
│   ├── hoge1
│   ├── hoge2
│   └── DATA
│       └── heart_rate.csv
├── ID_02
│   ├── hoge1
│   ├── hoge2
│   └── DATA
│       └── heart_rate.csv
├── ID_03
│   ├── hoge1
│   ├── hoge2
│   └── DATA
│       └── heart_rate.csv
├── ID_04
│   ├── hoge1
│   ├── hoge2
│   └── DATA
│       └── heart_rate.csv
└── ID_05
    ├── hoge1
    ├── hoge2
    └── DATA
        └── heart_rate.csv

このとき,heart_rate.csvへのパスを取得したければ,

DIR <- "上の図のDIRへパスを指定してください"
PATH2csv <- list.files(DIR,pattern="^heart_rate.csv$",include.dirs=TRUE,full.names=TRUE,recursive=TRUE)

のようにしてください.そうすれば,PATH2csvに,フルパスがすべて入ります.

 ファイルを一つ読み込んで処理するときは,i に番号を指定して

i <- 1
DAT <- read.csv(PATH2csv[i], header=TRUE)

などとしてください.

目的のファイル名の一部が共通のとき

以下のフォルダ構造のように,ID_01,ID_02などのフォルダがあり,各フォルダの中に,?????_heart_rate.csvが存在する場合を考えます.?????のところに,何か文字が書かれているとします.

DIR
├── ID_01
│   ├── hoge1
│   ├── hoge2
│   └── DATA
│       └── 29809_heart_rate.csv
├── ID_02
│   ├── hoge1
│   ├── hoge2
│   └── DATA
│       └── 97232_heart_rate.csv
├── ID_03
│   ├── hoge1
│   ├── hoge2
│   └── DATA
│       └── 836887_heart_rate.csv
├── ID_04
│   ├── hoge1
│   ├── hoge2
│   └── DATA
│       └── 09673_heart_rate.csv
└── ID_05
    ├── hoge1
    ├── hoge2
    └── DATA
        └── 24362_heart_rate.csv

このとき,******_heart_rate.csvへのパスを取得したければ,

DIR <- "上の図のDIRへパスを指定してください"
PATH2csv <- list.files(DIR,pattern="*.heart_rate.csv$",include.dirs=TRUE,full.names=TRUE,recursive=TRUE)

のようにしてください.そうすれば,PATH2csvに,フルパスがすべて入ります.ポイントは,共通部分heart_rate.csv$の前に,*.を書くことです.正規表現を使いこなせば,探すファイル名の詳細をしていできます.

chaos-kiyono.hatenablog.com

パスの部分とファイル名を分離する

上の例では,フルパスを取得しました.場合によっては,パスの部分とファイル名を分けたいときがあると思います. パスのみを切り出したいときは,

i <- 1
dirname(PATH2csv[i])

ファイル名のみを切り出したいときは

i <- 1
basename(PATH2csv[i])

としてください.