Как заменить значения в столбце данных, которые находятся в определенном диапазоне? - PullRequest
1 голос
/ 11 февраля 2012

У меня есть столбец данных, и для разных периодов я хочу заменить значения этого столбца на определенное значение.Например, для всех значений от 6 до 15 я хочу заменить на 10. Для всех значений от 16 до 25 я хочу заменить на 20 и т. Д. Какой самый простой способ сделать это?Спасибо

Ответы [ 4 ]

1 голос
/ 11 февраля 2012

если все как в вашем примере, вы можете использовать это:

y=randint(100,1,1309)+1; % generate data sample

y=10*floor((y+4)/10) % 'round' to 10
1 голос
/ 11 февраля 2012

Логическое индексирование:

y=rand(1, 50)
y(y>0.5) = 1
y

Вышеуказанное заменяет элементы y больше 0,5 на 1

Вы также можете использовать find, но логическое индексирование является очевиднымспособ сделать это.

0 голосов
/ 12 февраля 2012

Я думаю, что это самый простой способ.

a = rand(1308, 1)*1308; % replace with your column

target = [10 20]; % replace with your targets and ranges
left = [6 15];
right = [16 25];

for i=1:length(target)
    a(a>=left(i)&a<right(i)) = target(i);
end
0 голосов
/ 12 февраля 2012

Похоже, что вы хотите сделать некоторое объединение и заменить значения в определенном диапазоне на «медианное» значение этого диапазона? Ниже приведен код основного принципа. Используйте HISTC. Единственное, что вам может понадобиться изменить ниже, это «ребра», но в противном случае это должно сработать:

x = round(rand(1,1000)*1400); % Sample data

intervalSize = 10; % 5 to 15, 15 to 25 etc.

maxEdge = max(x) + intervalSize - mod(max(x), intervalSize);
edges = 0:intervalSize:max(x);
[n bin] = histc(x,edges); % Don't really need 'n'

for i = 1: (numel(edges) - 1)
    midValue = mean([edges(i) edges(i+1)]);
    x(bin == i) = midValue;
end

А вот еще один подход, который НЕ использует HISTC, но опирается исключительно на логическую индексацию.

%% Approach 2:
x = round(rand(1,1000)*1400); % Sample data
intervalSize = 10;
maxEdge = max(x) + intervalSize - mod(max(x), intervalSize);
edges = 0:intervalSize:max(x);

for i = 1: (numel(edges) - 1)
    midValue = mean([edges(i) edges(i+1)]);
    x(x >= edges(i) & x < edges(i+1)) = midValue;
end

Возможно, вам придется настроить условие логического индексирования, чтобы получить именно то, что вы хотите, но вы поняли идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...