Problem with table column not being double when workspace identifies it as such
4 次查看(过去 30 天)
显示 更早的评论
Hi, I import a data table textfile (usually there are several and it is looped) and have had some issues with it, I can overcome them but when I try to filter some data in the data column I am after (named 'trajectory_deg' in the original file but I separate it into a separate variable called traj) it will not allow it, telling me
"Undefined operator '>' for input arguments of type 'table'.
Error in untitled3 (line 73)
traj_copy((80>traj_copy)&(traj_copy>100))=NaN;"
In my workspace tray is class double, when I whos trap it tells me it is double, yet this problem persists, any ideas?
close all
clear all
clc
%%Get files
Folder_used = dir('/Users/files4data/*.txt');
files = Folder_used;
amountFILES=numel(files);
for k=1:amountFILES
% for k=1:1
opts = detectImportOptions(files(k).name);
data=readtable(files(k).name,opts);
possibleTrajStr={'Trajectory_deg','trajectory','trajectory_deg','Trajectory','Traj_deg','traj'};
possibleNozStr={'ExpID','Exp_ID','Exp ID'};
headers_in_data =data.Properties.VariableNames;
disp *************************************************************
%%*************************************************************
file=(files(k).name);
left_color = [0 0 0];
right_color = [0 0 0];
set(figure,'defaultAxesColorOrder',[left_color; right_color],...
'units','normalized','outerposition',[0 0 1 1]);
%%*************************************************************
ColForm=varfun(@class,data,'OutputFormat','cell');
[ColIndexLog,ColIndexDouble]=ismember(ColForm,'cell') ;
CellsInTable=find(ColIndexDouble);
indices = find(abs(CellsInTable)>4);
CellsInTable(indices) = [];
for g=1:numel(CellsInTable)
B=CellsInTable(g);
C=(headers_in_data(B));
CCC=char(string(C{:}));
XC=data.(CCC);
dataLoop=XC;
logicalIndex = ismember(dataLoop, 'UND. -60001');
dataLoop(logicalIndex) = {'NaN'};
S = sprintf('%s*', dataLoop{:});
N = sscanf(S, '%f*');
N2=array2table(N);
data.(CCC)=(N2);
end
TrajOuty = ismember(headers_in_data,possibleTrajStr);
[~,TrajColID] = find(TrajOuty);
traj=data(:,TrajColID);
traj=table2array(traj);
whos traj
traj_copy=traj;
traj_copy((80>traj_copy)&(traj_copy>100))=NaN;
traj_copy=(deg2rad(traj_copy-90))*1000;
% traj((80>traj)&(traj>100))=NaN;
% traj=(deg2rad(traj-90))*1000;
end
0 个评论
采纳的回答
Madeline Gardner
2018-7-3
Hello!
So there are a few things going on here.
One thing I noticed is that you turn N, the trajectory array, into a table before putting it back into data. This means that the table ends up nested, where the column inside the table is full of tables. If instead you just put N into the table directly, then you don't have to deal with that.
Second, if you index into a table using smooth parenthesis (), then it returns a table, which is also why your logical indexing wasn't working. If instead you use dot indexing and smooth parentheses, you can retrieve the actual data in the column by index, which can be indexed into logically.
Here is the code that seems to work for me -- I've included comments where I changed things. I hope it does what you intended!
Folder_used = dir('/Users/files4data/*.txt');
files = Folder_used;
amountFILES=numel(files);
for k=1:amountFILES
% for k=1:1
opts = detectImportOptions(files(k).name);
data=readtable(files(k).name,opts);
possibleTrajStr={'Trajectory_deg','trajectory','trajectory_deg','Trajectory','Traj_deg','traj'};
possibleNozStr={'ExpID','Exp_ID','Exp ID'};
headers_in_data =data.Properties.VariableNames;
disp *************************************************************
%%*************************************************************
file=(files(k).name);
left_color = [0 0 0];
right_color = [0 0 0];
set(figure,'defaultAxesColorOrder',[left_color; right_color],...
'units','normalized','outerposition',[0 0 1 1]);
%%*************************************************************
ColForm=varfun(@class,data,'OutputFormat','cell')
[ColIndexLog,ColIndexDouble]=ismember(ColForm,'cell');
CellsInTable=find(ColIndexDouble);
indices = find(abs(CellsInTable)>4);
CellsInTable(indices) = [];
for g=1:numel(CellsInTable)
B=CellsInTable(g);
C=(headers_in_data(B));
CCC=char(string(C{:}));
XC=data.(CCC);
dataLoop=XC;
logicalIndex = ismember(dataLoop, 'UND. -60001');
dataLoop(logicalIndex) = {'NaN'};
S = sprintf('%s*', dataLoop{:});
N = sscanf(S, '%f*');
% N2=array2table(N) - Deleted
data.(CCC)=N;
end
TrajOuty = ismember(headers_in_data,possibleTrajStr);
[~,TrajColID] = find(TrajOuty);
traj=data.(TrajColID); % Changed to dot indexing
% traj=table2array(traj) - Deleted
whos traj
traj_copy = traj;
traj_copy((80>traj_copy)|(traj_copy>100)) = NaN; % Changed & to |
traj_copy=(deg2rad(traj_copy-90))*1000
end
3 个评论
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Logical 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!