【问题标题】:Count or read only actual entries计数或只读实际条目
【发布时间】:2020-12-12 21:40:08
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: octave


    【解决方案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 文件(或者您只是想以编程方式处理它,而不需要人工干预),那么您可以使用 io 包中的 csv2cell 函数代替,并处理生成的单元格以获得您想要的,例如

      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 来获得结果。

    【讨论】:

    • 您可以使用C(cellfun(@isempty, C))=NaN; 代替for 循环和if 条件。 forifendifendfor 在单行中对我来说不好看。但这可能只是我。 csv2cell btw 的好主意
    • @SardarUsama 我更喜欢在 SO 答案中使用 for 循环而不是 cellfun,以防它造成更多混乱......但否则我同意看起来更好:) 顺便说一句,我使用 ischar 而不是 @ 987654345@ 是故意的,因为虽然从给定的数据中暗示空槽不包含空格,但没有指定(并且' ' 算作非空!)
    • :D 我其实想知道你为什么使用ischar。有见地!
    猜你喜欢
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2015-12-11
    • 1970-01-01
    相关资源
    最近更新 更多