【问题标题】:flatten matlab table by key按键展平matlab表格
【发布时间】:2014-11-20 09:15:10
【问题描述】:

我有一个大表,其中的条目是

KEY_A,KEY_B,VAL

其中 KEY_A 和 KEY_B 是有限的密钥集。为了参数,我们将有 4 个不同的 KEY_B 值和 4 个不同的 KEY_A 值。以及示例表:

KEY_A    KEY_B      KEY_C  
_____    _____    _________

1        1          0.45054
1        2         0.083821
1        3          0.22898
1        4          0.91334
2        1          0.15238
2        2          0.82582
2        3          0.53834
2        4          0.99613
3        1         0.078176
3        2          0.44268
3        3          0.10665
3        4           0.9619
4        1        0.0046342
4        2          0.77491
4        3           0.8173
4        4          0.86869
4        5          1

我想把桌子优雅地压扁成

KEY_A     KEY_B_1     KEY_B_2     KEY_B_3    KEY_B_4    KEY_B_5
_____    _________    ________    _______    _______    _______

1          0.45054    0.083821    0.22898    0.91334    -1
2          0.15238     0.82582    0.53834    0.99613    -1
3         0.078176     0.44268    0.10665     0.9619    -1
4        0.0046342     0.77491     0.8173    0.86869    1

我希望能够处理缺失的 B 值(将它们设置为默认值,例如 -1),但我认为如果我能以一种优雅的方式开始执行此操作,那么这些事情就会落实到位。

实际的表有数百万条记录,所以我确实想使用矢量化调用。

我得到的行(不处理 int invalid 5)是:

cell2mat(arrayfun(@(x)[x,testtable{testtable.KEY_A==x,3}'],unique(testtable{:,1}),'UniformOutput',false))

但是

  1. 它不会输出不同的表
  2. 如果表中缺少键,则不会处理

我认为这并不少见……以前有人做过类似的事情吗?

【问题讨论】:

    标签: matlab matlab-table


    【解决方案1】:

    如果输入表是T,那么你可以试试这个给定的情况-

    KEY_B_ =-1.*ones(max(T.KEY_A),max(T.KEY_B))
    KEY_B_(sub2ind(size(KEY_B_),T.KEY_A,T.KEY_B)) = T.KEY_C
    T1 = array2table(KEY_B_)
    

    已编辑输入的输出 -

    T1 = 
         KEY_B_1     KEY_B_2     KEY_B_3    KEY_B_4    KEY_B_5
        _________    ________    _______    _______    _______
          0.45054    0.083821    0.22898    0.91334    -1     
          0.15238     0.82582    0.53834    0.99613    -1     
         0.078176     0.44268    0.10665     0.9619    -1     
        0.0046342     0.77491     0.8173    0.86869     1     
    

    由 MadScienceDreams 编辑:这个答案引导我编写以下函数,它可以根据输入键将几乎所有表格组合在一起。享受吧!

    function [ OT ] = flatten_table( T,primary_keys,secondary_keys,value_key,default_value )
    %UNTITLED Summary of this function goes here
    %   Detailed explanation goes here
    if nargin < 5
        default_value = {NaN};
    end
    
    if ~iscell(default_value)
        default_value={default_value};
    end
    
    if ~iscell(primary_keys)
        primary_keys={primary_keys};
    end
    
    if ~iscell(secondary_keys)
        secondary_keys={secondary_keys};
    end
    
    if ~iscell(value_key)
        value_key={value_key};
    end
    primary_key_values = unique(T(:,primary_keys));
    num_primary = size(primary_key_values,1);
    [primary_key_map,primary_key_map] = ismember(T(:,primary_keys),primary_key_values);
    
    secondary_key_values = unique(T(:,secondary_keys));
    num_secondary = size(secondary_key_values,1);
    [secondary_key_map,secondary_key_map] = ismember(T(:,secondary_keys),secondary_key_values);
    
    %out =-1.*ones(max(T.KEY_A),max(T.KEY_B))
    
    try
        values = num2cell(T{:,value_key},2);
    catch
        values = num2cell(table2cell(T(:,value_key)),2);
    end
    
    if (~iscell(values))
        values=num2cell(values);
    end
    OT=repmat(default_value,num_primary,num_secondary);
    OT(sub2ind(size(OT),primary_key_map,secondary_key_map)) = values;
    label_array = num2cell(cellfun(@(x,y)[x '_' mat2str(y)],...
      repmat (secondary_keys,size(secondary_key_values,1),1),...
      table2cell(secondary_key_values),'UniformOutput',false),1);
    label_array = strcat(label_array{:});
    OT = [primary_key_values,cell2table(OT,'VariableNames',label_array)];
    
    end
    

    【讨论】:

    • 这很好,它确实输出了一个表格。稍加调整就可以输出正确的表,带有标签和主键。但是,我认为魔鬼似乎在缺少键的“默认”值中。我已经编辑了问题以反映这一点,但是您将如何修改您的方法来处理它? (我想我可以在重塑之前添加默认条目?
    • 不错的变化....我将在几秒钟内返回一个通用函数,该函数不依赖于作为可索引值的键(很简单),如果你把它放在我的会以你为答案。
    • @MadScienceDreams 如果您希望得到问题中提到的所需输出的确切输出,请在末尾添加 - KEY_A = unique(T.KEY_A); T1 = [array2table(KEY_A) T1]
    • @MadScienceDreams 很高兴看到代码被包装到一个函数中!希望这对您有好处,并感谢您的编辑。
    猜你喜欢
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 2013-09-12
    • 2011-11-12
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多