我将所有数据都放在一个巨大的表格中,现在正努力尝试使用它。我需要删除在几个特定列中具有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), :))
,它们不起作用。有谁知道我怎么能完成它?
答案 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,:) = [];