2012-02-11 1 views
1

私はデータの列を持っており、さまざまな怒りのためにこの列の値を特定の値に置き換えたいと思います。たとえば、6と15の間のすべての値に対して、10に置き換えたい。16と25の間のすべての値に対して、20などで置き換えたい。これを行う最も簡単な方法は何ですか? おかげ特定の範囲内にあるデータの列の値を置き換えるにはどうすればよいですか?

答えて

1

論理インデックス:

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

上記1

で0.5より大きいyの要素を置き換えるあなたにもfindを使用することができますが、論理的なインデックスは、これを行うための明白な方法です。

+0

ありがとうございました。私の値の範囲は0から1308ですから、私は10の範囲でそれをやりたいので、これを130回繰り返す必要があります。 a、b、cの値が異なると、y(y> = a&y <= b)= c、130回と入力する方が効率的ですか? –

+0

いくつかのビニングを行い、特定の範囲の値をその範囲の「中央値」の値に置き換えたいかのように見えますか?以下の私の解決策を見てください。 – eternaln00b

1

それはあなたの例では、すべてのようなものだならば、あなたはこれを使用することができます:

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

y=10*floor((y+4)/10) % 'round' to 10 
0

はあなたには、いくつかのビニングをしたいように見える、とその範囲の「中央値」の値を一定の範囲内の値を置き換え?以下は、基本原則のコードです。 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 

論理インデックス条件を調整して、必要なものを正確に取得する必要があるかもしれませんが、そのアイデアが得られます。

0

これは最も簡単な方法だと思います。

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 
関連する問題