我有2个Ids向量,我们称之为a_id(10000 x 1)& b_id(4500 x 1)。
我还有一个数值向量,我们称之为b_num(4500 x 1)。 b_num中的值对应于b_id中的id。
最后我有一个向量让我们称之为a_num,它是(10000 x 1),其中没有值。我想用b_num中的值填充它,其中id匹配a_id和b_id。
a_id b_id b_num
ADA BHN 2
PLB ADA 4
BHN LMK 3
LMK
所以结果看起来如下,
a_id a_num
ADA 4
PLB 0
BHN 2
LMK 3
我正在尝试使用ismember但是非常高兴。
a_num = NaN * ones(length(a_id(:, 1)), 1);
[found, pos] = ismember(a_id, b_id);
a_num(found(found~=0), 1) = b_num(pos(pos~=0), 1);
结果是
a_id a_num
ADA 4
PLB 2
BHN 3
LMK NaN
答案 0 :(得分:2)
首先,您可以使用与NaN
相同的输入参数ones
,因此请使用
a_num
a_num = NaN(size(a_id)); % Use size instead of length for clarity. length(x) = max(size(x))
ismember
开始工作我们可以在a_id
中找到b_id
的所有索引,并像这样分配
[bfound, idx] = ismember(a_id, b_id); % Find a_id members in b_id
a_num(bfound) = b_num(idx(bfound)); % Assign matched values
% output [4 NaN 2 3]
intersect
您可以使用intersect
的索引参数来避免某些逻辑索引。初始化a_num
之后......
[~, a_idx, b_idx] = intersect(a_id, b_id); % indices of b in a and a in b
a_num(a_idx) = b_num(b_idx);
% output [4 NaN 2 3]
答案 1 :(得分:1)
ismember
似乎工作正常。我想您只是错过了使用代码的found
部分(我的idxa
)。这是一个逻辑数组,因此您不需要执行此操作found(found~=0)
>> a_id ={ 'ADA' 'PLB' 'BHN' 'LMK'};
>> b_id = {'BHN' 'ADA' 'LMK'};
>> b_num = [2 4 3];
>> [idxa idxb] = ismember(a_id,b_id)
idxa =
1 0 1 1
idxb =
2 0 1 3
>> a_num = zeros(size(a_id));
>> a_num(idxa) = b_num(idxb(idxb~=0))
a_num =
4 0 2 3
注意:如果您愿意,请在初始化zeros()
中将nan()
替换为a_num
。