对于我试图在 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