一つのCSVファイル​のデータともう一つの​CSVファイルのデー​タを統合したいです.

具体的に,FILE Aには実験から得た「ある値のID」と「その量」がそれぞれ1列目と2列目に書かれています.FILE Bには「そのID」と「IDに対応する要素の名称」がそれぞれ1列目と2列目に書かれています.これら2つのファイルから「ID」と「IDに対応する要素の名称」と「その量」を対応させて同じファイルの出力したいです.(検索して一致したものを同じ行に表示?)拙い説明で申し訳ありませんが,よろしくお願い致します.

6 Comments

Excelのvlookup関数(検索値の合致のみ)と同じ動作はismember関数で実現できます。
テーブルへの列追加は、MATLAB'zさんのTwitterを参考にaddvarsを使いました。
【追加・変更】コメントを受けて、IDを数字から"ID_(数字)”に変更しました。
A = readtable('FILE_A.csv'); head(A,2) % 「ある値のID」と「その量」(先頭2行のみ表示)
ans = 2×2 table
ID measure __________ _______ {'ID_590'} 68.551 {'ID_943'} 895.51
B = readtable('FILE_B.csv'); head(B,2) % 「そのID」と「IDに対応する要素の名称」(先頭2行のみ表示)
ans = 2×2 table
ID element_name __________ ______________ {'ID_100'} {'element100'} {'ID_101'} {'element101'}
[~,idx] = ismember(A.ID,B.ID); %FILE Aの「ID」が、FILE Bの「ID」に存在するか探しインデックスを得る
C = addvars(A,B.element_name(idx),'Before','measure','NewVariableNames','element_name')
C = 19×3 table
ID element_name measure __________ ______________ _______ {'ID_590'} {'element590'} 68.551 {'ID_943'} {'element943'} 895.51 {'ID_871'} {'element871'} 235.86 {'ID_477'} {'element477'} 828.72 {'ID_993'} {'element993'} 469.72 {'ID_954'} {'element954'} 233.81 {'ID_119'} {'element119'} 847.94 {'ID_399'} {'element399'} 196.84 {'ID_837'} {'element837'} 19.156 {'ID_937'} {'element937'} 999.42 {'ID_962'} {'element962'} 702.23 {'ID_322'} {'element322'} 403.85 {'ID_346'} {'element346'} 759.74 {'ID_735'} {'element735'} 890.52 {'ID_580'} {'element580'} 877.07 {'ID_693'} {'element693'} 396.22
writetable(C,'FILE_C.csv');
type FILE_C.csv
ID,element_name,measure ID_590,element590,68.55095701 ID_943,element943,895.5147051 ID_871,element871,235.8594569 ID_477,element477,828.7176194 ID_993,element993,469.7161261 ID_954,element954,233.8060131 ID_119,element119,847.9362492 ID_399,element399,196.8424959 ID_837,element837,19.15642477 ID_937,element937,999.4162537 ID_962,element962,702.2303438 ID_322,element322,403.8534663 ID_346,element346,759.7416727 ID_735,element735,890.5186496 ID_580,element580,877.0735414 ID_693,element693,396.2157681 ID_522,element522,787.6044005 ID_252,element252,0.071197743 ID_468,element468,442.8061596
史哉
史哉 on 6 Jun 2022
Moved: Atsushi Ueno on 17 Aug 2022
ご回答ありがとうございます.一つお伺いしたいのですが,この「ID」が数字ではない場合はどのようにインデックスを定義すれば良いでしょうか.
Atsushi Ueno
Atsushi Ueno on 6 Jun 2022
Moved: Atsushi Ueno on 17 Aug 2022
csvファイルのIDを数字から"ID_(数字)”に変更しました。プログラムは変更していませんが同様に動きました。IDが数値でも文字でも、ismember関数の出力は何行目に在るかを示すインデックス番号なので、A.element(index)でテーブル内の目的の値にアクセスすることができます。
史哉
史哉 on 7 Jun 2022
Moved: Atsushi Ueno on 17 Aug 2022
何度もご丁寧にありがとうございます.大変参考になります.最後に,addvarsでは同じ行数の引数のみしか扱えませんが,行数異なる物も扱えるような列追加の関数はMatlabに存在するのでしょうか.
Atsushi Ueno
Atsushi Ueno on 8 Jun 2022
Moved: Atsushi Ueno on 17 Aug 2022
>行数異なる物も扱えるような列追加の関数はMatlabに存在するのでしょうか.
  • addvars関数が「行数が異なるデータを追加できる機能」を持つ事はないと思います。なぜなら、本質問の”ID”の様な関連性が判らない限り、どのデータが不足/過剰なのか判断出来ないからです。プログラマの責任で行数を合致させたデータをtableに追加する必要があります。
  • あるとすればExcelのv(/h)lookup関数ですが、MATLAB自体にこれと同じ関数はありません
  • 本質問や下記の様な情報が多くあります(matlab vlookupでググると沢山出てきます)
  • Excel の VLOOKUP と同じ機能はありますか? - (mathworks.com)
  • File Exchangeにも有志により作成されたvlookup関数が多数公開されています
  • File Exchange - MATLAB Central (mathworks.com)
史哉
史哉 on 13 Jun 2022
Moved: Atsushi Ueno on 17 Aug 2022
ご丁寧にありがとうございます.参考にさせていただきます.

Sign in to comment.

Answers (0)

Categories

Products

Release

R2019a

Tags

Asked:

on 3 Jun 2022

Moved:

on 17 Aug 2022

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!