【问题标题】:MATLAB - array2table nestingMATLAB - array2table 嵌套
【发布时间】:2014-12-03 21:59:00
【问题描述】:

为了简单起见,我将尝试从日常生活中举一个例子。假设我在一个名为 dataOriginal 的表中加载了一个 CSV 文件中的表,其中包含 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
    ...              ...            ...  ...  ...  ...
    

我正在努力解决将年、月等嵌套在一个名为“日期”的列中的部分。我想对上表中的日期元素进行如下处理:

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) 是我原始表中第一列的名称 - “名称”
  • dataOriginal.Properties.VariableNames(2) 是我原始表中第二列的名称 - “job”

不知道怎么插入

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

在命名列“日期”中以实现我的目标。

谢谢!

【问题讨论】:

    标签: arrays matlab concatenation


    【解决方案1】:

    试试下面的,它可能就是你想要的:

    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   
    

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

    【讨论】:

    • 嗨。感谢您的快速回复。寻址方式要好得多(data.date.year(1))。我按我的方式写它是因为我假设它是这样工作的。但是,您的代码返回错误“VariableNames 属性必须为表中的每个变量包含一个名称。表中的错误(第 304 行)t = setVarNames(t,vnames);如果无效、重复或为空,则错误百分比”
    • 没关系。我在没有变量的主表中有 2 个 table() 调用,但正如您所指出的那样,不需要这些。它工作得很好!!!太感谢了!最后一个问题 - 是否有可能让 MATLAB 实际上产生与我在原始帖子中想象的相同的输出?现在在“日期”列下,控制台只是为每个日期元素显示一个 [1x6 表格]。我也想在那个嵌套表里面看到,但是在调用大表时。有可能吗?
    • 编辑评论给你一些类似但不完全相同的东西。我认为,完全按照您上面指定的方式获取显示需要一个自定义函数。它可能是一个相当简单的函数,它采用了一些巧妙的递归来处理日期列中的表。
    猜你喜欢
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多