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 つの解決策になると思いますが、連続するサブセットのみに関数を適用する方法がわかりません。