将数据集转换为数值数组会更改Matlab中的值

时间:2013-10-09 00:53:19

标签: arrays matlab dataset

如果我想在Matlab中找到一个怪癖(我更习惯于R),我将不胜感激。我查看了帮助页面并用Google搜索,但我找不到这个确切的问题。

我正在处理由几年气候变量组成的数据。我将数值数组转换为数据集,因为我想根据不同类别的数据计算均值。

% Make matrix then a dataset out of column vectors
data = [Year MO DD HR MM SS DecimalDate T_21m RH_21m P_bar_12m ws_21m wd_21m ustar_21m            z_L_21m precip_mm Td_21m vpd wet_b T_soil T_bole_pi T_bole_fi T_bole_sp Rppfd_in_ Rppfd_out     Rnet_25m_ Rsw_in_25 Rsw_out_2 Rlw_in_25 Rlw_out_2 T_2m T_8m RH_2m RH_8m h2o_soil co2_21m q];
header = {'Year', 'MO', 'DD', 'HR', 'MM', 'SS', 'DecimalDate', 'T_21m', 'RH_21m', 'P_bar_12m', 'ws_21m', 'wd_21m', 'ustar_21m', 'z_L_21m', 'precip_mm', 'Td_21m', 'vpd', 'wet_b', 'T_soil', 'T_bole_pi', 'T_bole_fi', 'T_bole_sp', 'Rppfd_in_', 'Rppfd_out', 'Rnet_25m_', 'Rsw_in_25', 'Rsw_out_2', 'Rlw_in_25', 'Rlw_out_2','T_2m', 'T_8m', 'RH_2m', 'RH_8m', 'h2o_soil', 'co2_21m',  'q'};
dataset1 = dataset({data,header{:}});

这是前几行的内容,让您了解数据集:

  
    

数据集1(1:5,:)

  

ans =

Year    MO    DD    HR    MM    SS    DecimalDate    T_21m    RH_21m    P_bar_12m    ws_21m    wd_21m    ustar_21m    z_L_21m
1998    11    1     0     15    0     305.01          1.9     86.9      70.27        NaN       279.8     NaN          NaN    
1998    11    1     0     45    0     305.03          1.9     86.9      70.27        NaN       279.8     NaN          NaN    
1998    11    1     1     15    0     305.05         2.03     86.9      70.27        NaN       108.2     NaN          NaN    
1998    11    1     1     45    0     305.07         2.03     86.9      70.27        NaN       108.2     NaN          NaN    
1998    11    1     2     15    0     305.09         1.75       87      70.27        NaN       255.7     NaN          NaN    


precip_mm    Td_21m    vpd    wet_b    T_soil    T_bole_pi    T_bole_fi    T_bole_sp    Rppfd_in_    Rppfd_out    Rnet_25m_
0            4.47      NaN    NaN      NaN       NaN          NaN          NaN          0            NaN          -5.8     
0            4.47      NaN    NaN      NaN       NaN          NaN          NaN          0            NaN          -5.8     
0            4.61      NaN    NaN      NaN       NaN          NaN          NaN          0            NaN          -6.2     
0            4.61      NaN    NaN      NaN       NaN          NaN          NaN          0            NaN          -6.2     
0            4.33      NaN    NaN      NaN       NaN          NaN          NaN          0            NaN          -6.6     


Rsw_in_25    Rsw_out_2    Rlw_in_25    Rlw_out_2    T_2m    T_8m    RH_2m    RH_8m    h2o_soil    co2_21m    q    quantum
NaN          NaN          NaN          NaN          NaN     NaN     NaN      NaN      NaN         NaN        0    night  
NaN          NaN          NaN          NaN          NaN     NaN     NaN      NaN      NaN         NaN        0    night  
NaN          NaN          NaN          NaN          NaN     NaN     NaN      NaN      NaN         NaN        0    night  
NaN          NaN          NaN          NaN          NaN     NaN     NaN      NaN      NaN         NaN        0    night  
NaN          NaN          NaN          NaN          NaN     NaN     NaN      NaN      NaN         NaN        0    night  


YearOrd    Day    YearNom
1998       305    1998   
1998       305    1998   
1998       305    1998   
1998       305    1998   
1998       305    1998   

接下来,我添加了几个序数列,以便我可以将它们用作类别。以下是我使用的代码示例:

% Make a new data column based on year that is ordinal
y = min(Year(:));
Y = max(Year(:));
labels2 = num2str((y:Y)');
edges = y:Y+1;
dataset1.YearOrd = ordinal(dataset1.Year,labels2,[],edges);

接下来,我使用类别来计算均值,如下所示:

statmean = grpstats(dataset1,{'YearOrd','Day','quantum'},'mean','DataVars',{'T_21m', 'RH_21m', 'P_bar_12m'});

这是输出的样子(注意第一列的年份): ans =

                  YearOrd    Day    quantum    GroupCount    mean_T_21m    mean_RH_21m    mean_P_bar_12m
1998_305_night    1998       305    night      28             1.9579       87.067         70.151        
1998_305_day      1998       305    day        20              3.646       86.587         70.166        
1998_306_night    1998       306    night      28            0.76357       87.249         69.781        
1998_306_day      1998       306    day        20              2.258       86.669         69.668        
1998_307_night    1998       307    night      28             -2.735       80.785         69.862   

现在出现了问题。我希望能够使用这些方法进行进一步的计算(例如,将所有值除以数字),并且似乎在Matlab的数据集格式中不允许这样做。我的解决方案是使用'double'命令将数据集'statmean'转换为数字数组,如下所示:

statTest = double(statmean);

但是,从数据集到数字数组的转换会更改“年份”列中的值。我打印出数字数组的前几行来显示这一点。我怀疑它与之前的序数年份列中的水平有关,因为1998年是第一年。但是,我找不到有关如何更改它的信息。奇怪的是,一年中的某一天(第二列)正确地完成了从序数到数字的转换。对于这一年,我知道我可以添加1997,但我想了解发生了什么,所以我在数字数组和数据集之间进行转换时不会意外更改其他值。非常感谢所有人。

  
    

statTest(1:5,:)

  

ans =

1.0000  305.0000    1.0000   28.0000    1.9579   87.0671   70.1507
1.0000  305.0000    2.0000   20.0000    3.6460   86.5870   70.1660
1.0000  306.0000    1.0000   28.0000    0.7636   87.2493   69.7814
1.0000  306.0000    2.0000   20.0000    2.2580   86.6690   69.6680
1.0000  307.0000    1.0000   28.0000   -2.7350   80.7850   69.8621

0 个答案:

没有答案