首页 > 解决方案 > 在具有多种数据类型的表中查找值并将其设置为 NA 或 NaN

问题描述

我有一个大约 105 x 10 的表(我在这个问题中称为“T”),第 2 列和第 3 列包含字符串,其余的都包含数字。在第 5 到第 10 列(仅包含数字)中,我有一些 999 的值散布在我想要设置为 NA 或 NaN 的数据中。我怎样才能做到这一点?我试过了:

idx = T{:,5:10} == 999;
T{idx} = NaN;
T(ismissing(T,{999})) = NaN;
T{T==999}=NaN;
T(T{:,5:10}==999,:) = NaN;

表数据如下所示:

1   'LevelTwo'  'Trial1'    0   -0.354977112125573  -0.342962246562734  999 999 999 999
1   'LevelTwo'  'Trial1'    1   -0.185281358489472  0.196843601863376   0.191455534789190   0.191455534789190   0.196337466839364   0.239420563280515
1   'LevelTwo'  'Trial1'    1   0.393217912708115   0.301686005068917   -0.167798347008035  -0.167798347008035  -0.107991484625157  0.108461970332887
1   'LevelTwo'  'Trial1'    1   -0.145362442084958  -0.327523065746791  0.184717880799754   0.184717880799754   0.0848972787264908  0.166202231586311
1   'LevelTwo'  'Trial2'    1   -0.309966518338289  -1.67389513513988   0.186656639405178   0.186656639405178   -0.0898354852721748 -0.232764706067819
1   'LevelTwo'  'Trial2'    1   -0.0677751233445754 0.131643384129556   0.320810761759298   0.320810761759298   0.244546397660921   0.277629762491316
1   'LevelTwo'  'Trial2'    1   -0.180564795679273  0.101929692518556   -0.134486855393823  -0.134486855393823  -1.61383942825616   0.100825254423938
1   'LevelTwo'  'Trial3'    0   999 999 999 999 999 999
1   'LevelTwo'  'Trial3'    1   -0.281085702707834  -0.0950243910429598 -0.0856708961622575 -0.0856708961622575 -0.221969474699963  -0.158533022159099
1   'LevelTwo'  'Trial4'    1   -1.01621209202249   -1.05630974785680   -0.128439670451306  -0.128439670451306  0.216852995526501   0.154914119245274
10  'LevelTwo'  'Trial10'   0   -2.60256948228157   -2.21021399689544   -0.513562238953105  -0.513562238953105  -0.918985308726539  -1.11565199530760
10  'LevelTwo'  'Trial11'   0   0.638560227147980   -0.660529540036614  -0.0354971842584826 -0.0354971842584826 999 999

标签: matlabdatatablenan

解决方案


你的问题是你有一个逻辑索引矩阵,你想用它来索引到你的表的类似矩阵的部分。但是,表支持的唯一逻辑索引是逻辑索引的向量,这些索引引用了要选择的行列。索引行侧的逻辑向量选择所有引用列引用的行,反之亦然。它必须是这种方式,因为可能由索引的每个元素引用的可能的混合数据类型会产生歧义。

如果将数字表的子集作为单独的数字数组使用,则可以坚持使用逻辑索引:

numbers = T{:,5:10};
numbers(numbers == 999) = NaN;
T{:,5:10} = numbers;

或者您可以逐列直接处理表格,一次使用一个逻辑向量来索引行:

for ii = 5:10
    T{T{:,ii} == 999,ii} = NaN;
end

推荐阅读