0

昨日回答をいただきましたが、100%正しく機能していないことが1つあります。私のデータフレームSHORT:

ID  IDaxis  Y   Date-Time               Tdiff  
1   1       5   2012-06-11  13:10:30    0.00    
1   1       10  2012-06-11  15:10:30    2.00    
1   1       20  2012-06-11  17:10:30    2.00    
1   3       15  2012-06-11  13:20:30    0.00    
1   3       30  2012-06-11  14:20:30    1.00    
1   3       45  2012-06-11  17:20:30    3.00    
1   6       9   2012-06-11  13:35:30    0.00        
1   6       15  2012-06-11  15:35:30    2.00    
1   6       30  2012-06-11  18:35:30    3.00    
3   2       8   2012-06-11  13:50:30    0.00  
3   2       14  2012-06-11  14:55:30    1.083   
3   2       20  2012-06-11  16:55:30    2.00    
3   2       30  2012-06-11  19:00:30    2.083   
3   5       10  2012-06-11  13:40:30    0.00    
3   5       15  2012-06-11  16:45:30    3.083

ID-植物
IDaxis-植物の葉
Y-葉の長さ
日付-時間-測定の日付と時刻Tdiff-測定
間の時間(h)間隔

私はやってみたいです:

  1. 列SHORT$TtotのIDaxisのTdiffを合計します
  2. 列SHORT$YdiffのIDaxisのYの行間の差を計算します
  3. 列SHORT$YtotのIDaxisのYdiffを合計します

コード:

  1. SHORT$Ttot <- ave(SHORT$Tdiff, SHORT$IDaxis, FUN = cumsum)よく働く
  2. SHORT$Ydiff <- ave(SHORT$Y, SHORT$IDaxis, FUN = diff)

ここで問題があります。Ydiffは次のようになります(新しいIDxaisの最初の各行はequal = 0です):

ID  IDaxis  Y   Ydiff
1   1       5   0
1   1       10  5
1   1       20  10
1   3       15  0
1   3       30  15
1   3       45  15
1   6       9   0

しかし、Ydiffは次のようになります。

ID  IDaxis  Y   Ydiff
1   1       5   5
1   1       10  10
1   1       20  -5
1   3       15  15
1   3       30  15
1   3       45  15
1   6       9  -36

これはすべてコードを台無しにします:

3.3。SHORT$Ytot <- ave(SHORT$Ydiff, SHORT$IDaxis, FUN = cumsum)

非常に役立つコードで答えることができれば。
Rで作業を開始したばかりですが、これはデータフレームの簡略化されたバージョンです-問題を示すためだけです。それぞれ700IDの3つのデータフレームがあり、それぞれに100のIDaxisと25の変数があります。

4

1 に答える 1

1

ave2番目のコマンドの関数を次のように変更する必要があります。

function(x) c(0, diff(x))

の出力の長さがdiff元のベクトルよりも短いため(差1)、これが必要です。によって作成されたベクトルにゼロを追加するだけdiffです。これにより、各サブグループの最初の値がゼロになります。

完全なコード:

SHORT$Ttot <- ave(SHORT$Tdiff, SHORT$IDaxis, FUN = cumsum)
SHORT$Ydiff <- ave(SHORT$Y, SHORT$IDaxis, FUN = function(x) c(0, diff(x)))
SHORT$Ytot <- ave(SHORT$Ydiff, SHORT$IDaxis, FUN = cumsum)

結果:

   ID IDaxis  Y            Date.Time Tdiff  Ttot Ydiff Ytot
1   1      1  5 2012-06-11  13:10:30 0.000 0.000     0    0
2   1      1 10 2012-06-11  15:10:30 2.000 2.000     5    5
3   1      1 20 2012-06-11  17:10:30 2.000 4.000    10   15
4   1      3 15 2012-06-11  13:20:30 0.000 0.000     0    0
5   1      3 30 2012-06-11  14:20:30 1.000 1.000    15   15
6   1      3 45 2012-06-11  17:20:30 3.000 4.000    15   30
7   1      6  9 2012-06-11  13:35:30 0.000 0.000     0    0
8   1      6 15 2012-06-11  15:35:30 2.000 2.000     6    6
9   1      6 30 2012-06-11  18:35:30 3.000 5.000    15   21
10  3      2  8 2012-06-11  13:50:30 0.000 0.000     0    0
11  3      2 14 2012-06-11  14:55:30 1.083 1.083     6    6
12  3      2 20 2012-06-11  16:55:30 2.000 3.083     6   12
13  3      2 30 2012-06-11  19:00:30 2.083 5.166    10   22
14  3      5 10 2012-06-11  13:40:30 0.000 0.000     0    0
15  3      5 15 2012-06-11  16:45:30 3.083 3.083     5    5
于 2012-12-17T10:40:59.593 に答える