0

Rで連続した深度データを合計するにはどうすればよいですか? 例えば:

a <- data.frame(label = as.factor(c("Air","Air","Air","Air","Air","Air","Wood","Wood","Wood","Wood","Wood","Air","Air","Air","Air","Stone","Stone","Stone","Stone","Air","Air","Air","Air","Air","Wood","Wood")), 
                depth = as.numeric(c(1,2,3,-1,4,5,4,5,4,6,8,9,8,9,10,9,10,11,10,11,12,10,12,13,14,14)))

指定された出力は次のようになります。

Label Depth
Air    7
Wood   3
Stone  1

最初に負の値の除去は で行われますcummax()。これは、深さがこの特殊なケースでしか増加できないためです。したがって:

   label depth
1    Air     1
2    Air     2
3    Air     3
4    Air     3
5    Air     4
6    Air     5
7   Wood     5
8   Wood     5
9   Wood     5
10  Wood     6
11  Wood     8
12   Air     9
13   Air     9
14   Air     9
15   Air    10
16 Stone    10
17 Stone    10
18 Stone    11
19 Stone    11
20   Air    11
21   Air    12
22   Air    12
23   Air    12
24   Air    13
25  Wood    14
26  Wood    14

これで、連続するすべての行の深さの増加が最大最小になります:(問題は、このステップをどのように行うかです)

   label depth
1   Air     4
2   Wood    3
3   Air     1
4   Stone   1
5   Air     2
5   Wood    0

最後に、これらの最大最小値を合計すると、出力は上記のようになります。

出力を達成するための手順:

最初の明らかな解決策は、たとえば Air の場合です。

diff(cummax(a[a$label=="Air",]$depth))

このソリューションは、予期される一定の深さの増加のために必要な負のデータを取り除きます。問題は、出力が各連続サブセット間の大きなステップも考慮に入れていることです。したがって、Air の合計は 7 ではなく 12 になります。

 [1] 1 1 0 1 1 4 0 0 1 1 1 0 0 1

さらに悪いのは、集計を使用したソリューションです。たとえば、次のようになります。

aggregate(depth~label, a, FUN=function(x){sum(x>0)})

注:大きなジャンプをフィルタリングするソリューションは、私が探しているものではありません。Air の例でもう一度 <2 の制限をハードコーディングすることもできます。

sum(diff(cummax(a[a$label=="Air",]$depth))[diff(cummax(a[a$label=="Air",]$depth))<2])

ほぼ正しい結果が得られますが、ここで期待どおりに機能しません。多くの異なるタスクで珍しい問題ではないため、探している機能が既にあると確信しています。

マテリアルごとに連続する行の各セットの最小値と最大値を取得し、それらを合計することが 1 つの解決策になると思いますが、連続するサブセットのみに関数を適用する方法がわかりません。

4

3 に答える 3

0

使用する基本Rメソッドaggregate

aggregate(cbind(val=cummax(a$depth)),
          list(label=a$label, ID=c(0, cumsum(diff(as.integer(a$label)) != 0))),
          function(x) diff(range(x)))

集計する最初の引数は、OP が上記の入力ベクトルに対して行うように、累積最大値を計算しcbindます。計算されたベクトルの最終出力を提供するために使用します。2 番目の引数はグループ化引数です。rleこれは、差の累積合計を計算する とは異なる方法を使用します。最後に、3 番目の引数は、各グループの範囲の差をとって目的の出力を計算する関数を提供します。

これは戻ります

  label ID val
1   Air  0   4
2  Wood  1   3
3   Air  2   1
4 Stone  3   1
5   Air  4   2
6  Wood  5   0
于 2017-06-25T19:41:49.953 に答える