计算或只读取实际条目

Count or read only actual entries

如何只计算或读取列的实际条目,以区别于非零条目?

换句话说,如果我有文件:

4000,1,5221,0
4001,0,5222,1
4002,3,,,

第 4 列有 2 个实际条目,其中一个消失了。我可以这样计算条目:

R = csvread("bugtest.csv");

for i = 1:4
VanishingColEntries(i) = numel (find (R(:,i) ==0));
NonVanishingColEntries(i) = nnz(R(:,i));
endfor
VanishingColEntries
NonVanishingColEntries 

产量:

octave:2> nument
VanishingColEntries =

   0   1   1   2

NonVanishingColEntries =

   3   2   2   1

但是,我不知道如何提取“实际”条目的数量,即非零条目和显式零条目的总和!

csvread 仅适用于数字数据。如果 csvread 遇到一个不是严格数字的条目,它会检查字符串是否以数字开头,并将其用作结果(例如 1direction, 2pac, 7up 将导致 1,2,7 )。 'Empty' 这里的条目实际上被认为是一个空字符串,被解析为数字 0。但是,还有一些特殊的字符串,如 naninf 被特殊解析。

如果您可以/乐于预处理您的 csv 文件,那么您可以将所有空条目替换为字符串 nan(不带引号)。 csvread 然后将特殊处理此字符串,并在生成的数字矩阵中将其替换为实际的 nan 值。然后,您可以将其与 isnan 一起使用来计算 nan / non-nan 条目的数量,如下所示:

  R = csvread( 'bugtest.csv' );

% Count nan / non-nan entries along rows
  VanishingColEntries    = sum(  isnan( R ), 1 )
  NonVanishingColEntries = sum( ~isnan( R ), 1 )

如果您没有预处理 csv 文件的奢侈(或者您只是想在整个过程中以编程方式处理它,而不需要人工干预),那么您可以使用 csv2cell 中的函数 io 打包,然后处理生成的单元格以获得您想要的内容,例如

  pkg load io
  C = csv2cell( 'bugtest.csv' )

% Convert cells with empty strings to nan
  for i = 1 : numel(C), if ischar(C{i}), C{i} = nan; endif, endfor

% Convert numeric cell array (nan is a valid number) to a matrix
  R = cell2mat( C );

然后您可以像以前一样使用 isnan 来获得结果。