MATLAB - array2table嵌套

时间:2014-12-03 21:59:01

标签: arrays matlab concatenation

为了简单起见,我将尝试从日常生活中汲取一个例子。假设我在CSV文件中加载了一个名为 dataOriginal 的表,其中包含3列 - 名称,作业,日期。

让我们仔细看看“日期”栏目:

date
____
'13.01.2014 20:34'
'22.03.2014 11:17'
...

我想在日期向量中分割日期,并将此向量(以及每个列的变量名称(因为我们有多个日期,我们事实上已经是矩阵))添加到新表中的列中命名为“日期”,但包含所有命名内容,如年,月等。


这是我到目前为止所做的事情(对于糟糕的代码质量感到遗憾,但我刚开始学习MATLAB: - /):

  1. 我将每个日期分成日期向量,并为每个元素添加名称,如下所示:

    dateFormat = 'dd.mm.yy HH:MM';
    [year,month,day,hour,minute,second] = datevec(datesRaw, dateFormat);
    

    所以我有这个:

    year(1) % returns '2014' since this is the first date in my column
    year % returns all years in my entire column
    
  2. 然后我将上面的内容转换为表格:

    dates = array2table([year,month,day,hour,minute,second],'VariableNames',{'year','month',...,'second'});
    

    所以我得到了一个很好的输出

    year   month       second
    ____   _____  ...  ______
    2014     1            0
    2014     3            0
    ...    ...   ...    ...
    

    通过简单地调用例如:

    ,这使我可以轻松读取每列的访问权限
    year % returns all years
    year(1) % returns first entry's year (here: '2014' from '13.01.2014 20:34')
    
  3. 我已经处理了我的其他列,对这些列进行了各种操作,最后我试图水平连接所有这些:

    name              job                   date
    ____    _____________________  _____________________
                                   year month ... second
                                   ____ _____     ______
    "Bob"   "Construction worker"  2014   1   ...   0
    "Alice" "Waitress"             2014   3   ...   0
    ...              ...            ...  ...  ...  ...
    
  4. 我正在与名为“date”的单个列中的年,月等嵌套的部分进行精确对比。我想在上面的表格中解决日期元素,如下所示:

    myData.name(1) % will return 'Bob'
    myData.job(1) % will return 'construction worker'
    myData.date(1).year(1) % should return '2014' for Bob, the construction worker
    

    目前我在出汗和咒骂之后有以下代码:

    dataFinal = 
        horzcat(array2table([dataProcessed(:,1),dataProcessed(:,2)],'VariableNames',[dataOriginal.Properties.VariableNames(1),dataOriginalProperties,VariableNames(2)]],
        array2table([year,month,day,hour,minute,second],'VariableNames',{'year','month','day','hour','minute','second'}))
    

    ,其中

    • dataProcessed(:,1)是我处理过的名字
    • dataProcessed(:,2)是我已处理的作业
    • dataOriginal.Properties.VariableNames(1)是我原始表格中第一列的名称 - “name”
    • dataOriginal.Properties.VariableNames(2)是我原始表格中第二列的名称 - “job”

    我不知道如何插入

    array2table([year,month,day,hour,minute,second],'VariableNames',{'year','month','day','hour','minute','second'})
    

    在命名列“date”中,以实现我的目标。

    谢谢!

1 个答案:

答案 0 :(得分:0)

请尝试以下操作,它可能正是您所寻找的:

data = table(names, jobs, table(years, months, ...), 'VariableNames', {'name', 'job', 'date'})

虽然您将按如下方式处理,但与您所说的内容略有不同;它可能仍然适用于您的目的:

data.name(1);
data.job(1);
data.date.year(1);

编辑:要查看输出,请执行

disp([data(:, ~strcmp(data.Properties.VariableNames, 'date')), data.date])
names    ids    years    months
_____    ___    _____    ______
'Bob'    1      2014     4     
'Max'    2      2013     8   

(编辑评论时,我没有完全复制答案中的数据和字段,但我认为你应该明白这一点。)