How to lookup and return a corresponding value from table?
48 次查看(过去 30 天)
显示 更早的评论
I have a table the first column of which contains a string and other columns contain numeric data, how do I match the string and return the corresponding values form other columns for this string. Lets say for 'obs2' I want '2' as output. I am using following code but this isn't working.
cmnt0 = {'obs1';'obs2';'obs3';'obs4'};
curve=[1;2;3;2];
cmnt1 = table(cmnt0,curve,'VariableNames',{'obs','Curve'})
for i=[1,2,3,4]
x=strcmp(cmnt1(i,1),'obs1')
if x==1
%% some code here after that
end
end
0 个评论
采纳的回答
Voss
2021-12-27
编辑:Voss
2021-12-27
It isn't working because cmnt1(i,1) is a sub-table of the table cmnt1 that contains one cell of cmnt1. You want to refer to the contents of the cell directly, so use curly brace indexing:
cmnt0 = {'obs1';'obs2';'obs3';'obs4'};
curve=[1;2;3;2];
cmnt1 = table(cmnt0,curve,'VariableNames',{'obs','Curve'})
% introduce a third column for demonstration:
cmnt1.Curve_2 = [5;6;7;8]
for i=[1,2,3,4]
% x=strcmp(cmnt1(i,1),'obs1')
x=strcmp(cmnt1{i,1},'obs1')
if x==1
%% some code here after that
output = cmnt1{i,2:end} % do this to store the contents of the cells in columns 2 to the end (which are all numeric), or
output = cmnt1{i,2} % do this to store the contents of the cell in column 2
end
end
You can do the same thing without a loop, using logical indexing, which is intended to also handle the situation where the string you are matching occurs more than once in the first column of the table:
% introduce a second 'obs1':
cmnt1{3,1} = {'obs1'}
is_match = strcmp(cmnt1{:,1},'obs1')
output_array = cmnt1{is_match,2:end}
output_subtable = cmnt1(is_match,2:end)
更多回答(1 个)
dpb
2021-12-27
I'd start by turning 'obs' into a categorical variable...
cmnt0 = categorical({'obs1';'obs2';'obs3';'obs4'});
curve=[1;2;3;2];
tC = table(cmnt0,curve,'VariableNames',{'Obs','Curve'});
...
C=t.Curve(t.Obs=='Obs1');
Alternatively, if there is some reason to not create the categorical variable, then
C=t.Curve(contains(t.Obs,{'Obs1'}));
With such a data set, I'd suggest you'll find that groupsummary and/or rowfun and friends with grouping variables will solve virtually all such problems almost automagically.
3 个评论
Steven Lord
2021-12-27
I would probably use matches instead of strcmp or strcmpi.
matches(["ab1"; "ab10"], "ab1")
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Characters and Strings 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!