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

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
4

0 に答える 0