如何在几个特定列中删除具有NaN的行

时间:2016-02-02 06:01:00

标签: matlab

我将所有数据都放在一个巨大的表格中,现在正努力尝试使用它。我需要删除在几个特定列中具有NaN的行。此外,该表位于数组内。这是一个简化版本:

Col1 = [ 1;   1;   1;  NaN];
Col2 = [ 1;   1;  NaN; NaN];
Col3 = [NaN; NaN; NaN;  1 ];
Col4 = [ 1;   1;  NaN; NaN];
Rows = {'Row1'; 'Row2'; 'Row3'; 'Row4'};
T = table(Col1, Col2, Col3, Col4, 'RowNames', Rows)   %this is the table

data(1).tables = T         %this is the array that contains the table

表格如下:

        Col1    Col2    Col3    Col4
        ____    ____    ____    ____

Row1      1       1     NaN       1 
Row2      1       1     NaN       1 
Row3      1     NaN     NaN     NaN 
Row4    NaN     NaN       1     NaN 

我需要删除第2列到第4列中包含所有NaN的所有行。因此,在此示例中,应删除Row3,输出将如下所示:

        Col1    Col2    Col3    Col4
        ____    ____    ____    ____

Row1      1       1     NaN       1 
Row2      1       1     NaN       1 
Row4    NaN     NaN       1     NaN 

在真实表中有很多列,所以我需要删除列中带有NaN的行,比如130到160.所以用逗号列出它们是不可取的。但是,需要检查NaN的所有列都是相邻的,所以理想情况下它应该指定一系列列,例如:data(1).tables2 = data(1).tables(~isnan(data(1).tables(:,2:4), :)),它们不起作用。有谁知道我怎么能完成它?

2 个答案:

答案 0 :(得分:5)

我建议采用以下单行解决方案:

T(all(isnan(T{:,2:4}),2),:) = []

这给出了美味的结果:

T = 

            Col1    Col2    Col3    Col4
            ____    ____    ____    ____

    Row1      1       1     NaN       1 
    Row2      1       1     NaN       1 
    Row4    NaN     NaN       1     NaN 

答案 1 :(得分:3)

您可以通过以下方式实现此目的:

row_idx = find(all(isnan(data(1).tables{:,2:3}),2))
data(1).tables(row_idx,:) = [];

现在你有:

data(1).tables
ans = 
            Col1    Col2    Col3    Col4
            ____    ____    ____    ____

    Row1      1       1     NaN       1 
    Row2      1       1     NaN       1 
    Row4    NaN     NaN       1     NaN 

您也可以仅使用逻辑索引来执行此操作,但在我看来,首先使用find来检索索引通常是可以的。但请注意:如果表格非常大,并且/或者速度很重要,则应使用逻辑索引。

使用逻辑索引:

data(1).tables(all(isnan(data(1).tables{:,2:3}),2),:) = [];

<强>故障:

创建一个矩阵,其中包含2.和3.列中有NaN的矩阵。

isnan(data(1).tables{:,2:3})

检查两个值是否等于1.注意最后2。如果没有这个,all将查看行而不是列。

all(isnan(data(1).tables{:,2:3}),2)

找到NaN行的索引

find(all(isnan(data(1).tables{:,2:3}),2))

最后,从表中删除这些行:

data(1).tables(row_idx,:) = [];