我有一个包含多个字段的数据集,其中几个字段是等效属性的不同名称。我已经重新缩放并调整了数据,以便数量可比,并希望将它们合并到一个字段中。
作为一个玩具示例,假设我有:
s = struct('pounds', [nan nan 4.8], 'pennies', [120 370 nan]);
s.pennies = s.pennies/100;
如何合并不完整的字段以获得所需的输出:
snew = struct(pounds, [1.2 3.7 4.8]);
答案 0 :(得分:2)
如果您修改了字段值以使它们相等,并且只需要合并非NaN
值,则一种选择是vertically concatenate个字段,然后使用min
或在各列的下方max
(将忽略NaN
的值)。然后只需使用rmfield
删除不需要的字段:
>> s = struct('pounds', [nan,nan,4.8], 'pennies', [120,370,nan]);
>> s.pounds = min([s.pounds; s.pennies./100], [], 1); % Scaling included here
>> s = rmfield(s, 'pennies')
s =
struct with fields:
pounds: [1.2000 3.7000 4.8000]
答案 1 :(得分:1)
以下内容适用于任意数量的字段。由于可以保证在每个位置上都没有NaN
一个字段,因此您可以
NaN
。通过假设,这将为每列恰好给出一个数字。
s = struct('pounds',[nan,nan,4.8], 'pennies', [120,370,nan])
s.pennies = s.pennies/100; % example data
target_field = 'pounds'; % field to which the conversion has been done
t = struct2cell(s); % convert struct to cell array
t = vertcat(t{:}); % convert cell array to matrix
t = t(~isnan(t)).'; % keep only numbers, ignoring NaN's
result = struct(target_field, t); % arrange into a struct
答案 2 :(得分:0)
在下面试试我的两层纸
c=struct2cell(s);
s=struct('pounds',unique([c{:}]));
甚至更好,您也可以使用以下oneliner
s=struct('pounds',unique(cell2mat(cellfun(@(x) x(:), struct2cell(s),'UniformOutput',false)))')