1

对于我试图在 Matlab 中找出的一个怪癖,我将不胜感激(我更习惯于 R)。我浏览了帮助页面并用谷歌搜索,但我找不到这个确切的问题。

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

% 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,:)

答案=

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'});

这是输出的样子(注意第一列是 year ): 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,:)

答案=

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
4

0 回答 0