2014-12-03 135 views
0

爲了簡單起見,我將嘗試以日常生活爲例。比方說,我有一個CSV文件中的表格加載在名爲的dataOriginal中,並帶有3列 - 名稱,作業,日期。MATLAB - array2table嵌套

讓我們在列「日期」仔細一看:

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 
    ...    ...   ... ... ... ... 
    

我正在與名爲「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)是我原始表中第一列的名稱 - 「名稱」
  • dataOriginal.Properties。VariableNames(2)是第二列在我的原始表的名字 - 「工作」

我不知道如何插入

array2table([year,month,day,hour,minute,second],'VariableNames',{'year','month','day','hour','minute','second'}) 
在名爲「約會」

爲了完成我的目標。

謝謝!

回答

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 

(編輯評論我並沒有完全複製從答案中的數據和字段時,但我認爲你應該明白這一點)。

+0

嗨。感謝您的快速回復。尋址的方式好得多(data.date.year(1))。我是這樣寫的,因爲我假設這是它的工作原理。您的代碼會返回錯誤「變量名屬性必須包含表中每個變量的一個名稱 表(行304)中的錯誤 t = setVarNames(t,vnames);%錯誤如果無效,重複或空」 – rbaleksandar 2014-12-04 08:03:40

+0

沒關係。我在主表中沒有變量的情況下進行了2次table()調用,但正如您已經指出的那樣,不需要這些調用。它工作完美!非常感謝!最後一個問題是 - 是否有可能使MATLAB實際產生與我在原始文章中想象的相同的輸出? Rigth現在在「日期」欄下,控制檯只顯示每個日期元素的[1x6表格]。我也想看看嵌套表格內部,但是在調用大表格時。有可能這樣做嗎? – rbaleksandar 2014-12-04 08:10:02

+0

編輯評論給你類似的東西,但不完全一樣。完全按照上面指定的方式獲取顯示將需要自定義功能,我想。它可能是一個相當簡單的函數,它使用了一些巧妙的遞歸來處理日期列中的表格。 – KevinMc 2014-12-05 07:30:38