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,:)
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 年が最初の年だったので、以前の序列の年の列のレベルと関係があるのではないかと思います。ただし、変更方法に関する情報が見つかりません。奇妙なことに、年間通算日 (2 列目) は、序数から数値への変換が正しく行われました。年については、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