我收到了一百个文件,其中所有的NaN被误写为“N.A。”#39;。我需要更正所有文件才能在Matlab中进行计算。我写了一些代码如下,但总是抱怨错误。我在代码中尝试使用带引号和不带引号的N.A.但仍然出错。有人可以帮忙吗?我真的不知道代码在哪里出错。
Data = dir('*.xls');
namelist1={Data.name};
for w = 1: numel(Data)
basefilenamedata=Data(w).name;
T=readtable(basefilenamedata);
P=table2array(T);
P(P ==N.A.) = NaN; % here I also tried P(P =='N.A.') = NaN, but still an error
W=array2table(P);
writetable(W,fullfile(DataFolder,[basefilenamedata '.xls']),'Sheet',1,'Range','A1');
end
Error: File: untitled Line: 7 Column: 15
Unbalanced or unexpected parenthesis or bracket.
文件示例1:
colony center_y center_x radii area
1 1486.035197 1994.842984 52 8494.866535
2 1839.73197 439.5529361 58 10568.31769
3 1173.664471 403.4185646 64 12867.96351
4 N.A. N.A. N.A. N.A.
5 N.A. N.A. N.A. N.A.
文件示例2:
Area Centroid_1 Centroid_2 MeanGrey ColonyNum
12984 868.0061614 340.6169901 61 1
12378 1289.909517 253.0196316 67 2
N.A. N.A. N.A. N.A. 3
答案 0 :(得分:2)
查看standardizeMissing
T0 = readtable(basefilenamedata);
T = standardizeMissing(T0 ,{Inf,'N/A','N.A.'},'DataVariables',{'a','x'}) %change to your data variables name
第二件事,比较matlab中的字符串你应该使用strcmp
而不是==
。
第三件事,您可以看到表格的外观,在命令行中运行open('patients.xls')
。
答案 1 :(得分:1)
excel文件中的find-replace可以快速解决此问题。无论如何,如果你想以编程方式解决它,我会先解释你发生了什么。
函数readtable
尝试启发式地定义表列的类型,在解析它们之前在内部调用detectImportOptions
。如果它找到字符串(不同于通常用于表示真NaN
的字符串,例如,在此示例中,N.A.
)与数字相结合,它可能决定将该特定列解释为字符串列值。
要解决此问题,请致电detectImportOptions
,手动修改VariableTypes
参数"",然后将其传递给readtable
功能。
for w = 1: numel(Data)
basefilenamedata = Data(w).name;
opts = detectImportOptions(basefilenamedata);
% Make sure that your P column type is set as double...
opts = setvartype(opts,{'double' 'double' 'double' ...});
T = readtable(basefilenamedata,opts);
% Go on writing...
end
如果文件完全相同,您也可以在循环外使用第一个文件执行此操作,然后将相同的opts
传递给所有readtable
个电话。
这种方法比清理您的输入要快得多,在解析数据后清理数据以及所有这些方法......尤其是如果您可以为所有文件使用单个选项。