Найти значения в таблице с несколькими типами данных и установить их в NA или NaN - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть таблица (которую я назвал 'T' в этом вопросе), которая составляет примерно 105 x 10, со столбцами 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

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Следующая строка кода делает именно то, что мне нужно.

standardizeMissing(T,999)
0 голосов
/ 10 апреля 2019

Ваша проблема в том, что у вас есть матрица логических индексов, которую вы хотите использовать для индексации в подобной матрице секции вашей таблицы.Однако единственная логическая индексация, поддерживаемая таблицами , - это векторы логических индексов, указывающих, какие строки или столбцы выбрать.Логический вектор на стороне строки индекса выбирает строки, на которые ссылаются все столбцы, на которые есть ссылки, и наоборот.Так должно быть из-за неоднозначности, которая может возникнуть из-за возможных смешанных типов данных, на которые может ссылаться каждый элемент индекса.

Вы можете придерживаться логической индексации, если работаете с подмножеством таблицычисловой как отдельный числовой массив:

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

Или вы можете работать столбец за столбцом, чтобы иметь дело с таблицей напрямую, с одним логическим вектором для индексирования строк за раз:

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