Excelの数値変換について

26 views (last 30 days)
健気 大川
健気 大川 on 27 May 2021
Commented: 健気 大川 on 29 May 2021
図に添付したようにB列に0,1,10の数値があります。この数値を1を見つけたら10を見つけるまでの間の数値を5に変換したいです。現在説明のためC列に変換後を示しています。出力は同じB列に変換したもの上書きしたいです。どなたか助言をお願いいたします。

Accepted Answer

Hernia Baby
Hernia Baby on 27 May 2021
Edited: Hernia Baby on 28 May 2021
find関数で1と10の座標を見つけ、その間を5で埋めます
※存在しないx1を設定していましたのでxに修正しました
clear,clc;
x=xlsread('test2.xlsx');
[idx(:,1), ~] = find(x==1);
[idx(:,2), ~] = find(x==10);
for i = 1:length(idx(:,1))
x(idx(i,1):idx(i,2),1)=5;
end
x
  7 Comments
Hernia Baby
Hernia Baby on 29 May 2021
網羅した物を用意しました。
PointはStep2 ~ 4になります。
Step2 端点補正
Step3 1~10のペアを作る
Step4では 以下のようなケースを想定しています(パターン2)
  ... 10 0 1 0 0 0 0 1 0 0 0 10 0 0 ...
⇒ ... 10 0 1 0 0 0 0 5 5 5 5 5 0 0 ...
clear,clc;
% x=xlsread('test2.xlsx');
%% Step0 初期値設定
x = zeros(17,1);
b = 1; a = 10; %パターン1
% a = 1; b = 10; %パターン2
x([2 6 9 11 15],1) = a;
x([4 13 17],1) =b;
%% Step1 1と10の行番号抽出
[idx1(:), ~] = find(x==1); % 1の行番号
[idx2(:), ~] = find(x==10); % 10の行番号
%% Step2 端点補正(1から始まり10で終わる)
idx2 = idx2(idx1(1)<idx2); % 最初の1以前の10を除外
idx1 = idx1(idx1<idx2(end)); % 最後の10以降の1を除外
%% Step3 [1 0 … 0 10]のペアを作る
% 各1の行番号以上かつ最近傍の10の行番号をペアで格納
cnt = 0;
while cnt < length(idx1)
cnt = cnt + 1;
idx(cnt,1) = idx1(cnt);
idx(cnt,2) = min(idx2(idx2>idx1(cnt)));
end
%% Step4 [1 0 … 1 … 0 10]の場合
% 1と10の間で最も近いものを採用
% 詳細は以下url
% https://jp.mathworks.com/matlabcentral/answers/812535-#answer_684355
[~,num] = unique(idx(:,2),'last');
idx = idx(num,:);
%% Step5 変換開始
x1 = x; % 比較用
for i = 1:length(idx(:,1))
x1(idx(i,1):idx(i,2),1)=5;
end
%% Step6 出力結果比較
[x, x1] % [変換前, 変換後]
ans =
0 0
10 10
0 0
1 5
0 5
10 5
0 0
0 0
10 10
0 0
10 10
0 0
1 5
0 5
10 5
0 0
1 1
健気 大川
健気 大川 on 29 May 2021
解決いたしました!何度も質問してしまいお手数おかけいたしました。
本当にありがとうございました!

Sign in to comment.

More Answers (1)

Atsushi Ueno
Atsushi Ueno on 27 May 2021
Edited: Atsushi Ueno on 27 May 2021
上記Q&Aを真似てExcelの入出力を追記しました。
% 数値だけ読み込む(Aはテストデータと正解の両方)
[A,~,~] = xlsread('test4matlab.xls');
% テストデータだけをBにおく
B = A(:,1)'
% 結果をおくCを一旦ゼロクリアする
C = zeros(1,size(B,2));
% Cの「B=1の所からB=10の所まで」を5に設定する
C(cell2mat(arrayfun(@colon, find(B==1), find(B==10), 'un', false))) = 5
% 同じB列に変換したもの上書きする
xlswrite('test4matlab.xls', C', 'B2:B24');

Categories

Find more on table in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!