マトリックスの各行について、指定された値より大きい値を持つ列の数を計算しようとしています。私はこの単純な質問をしていることを残念に思いますが、私はそれを理解することができませんでした。
関心のあるいくつかの空間ポイントについて、複数年のラスターのラスタースタックから最大温度値を抽出しました。データは次のようになります。
data <- cbind('1990' = c(25, 22, 35, 42, 44), '1991' = c(23, 28, 33, 40, 45), '1992' = c(20, 20, 30, 41, 43))
1990 1991 1992
1 25 23 20
2 22 28 20
3 35 33 30
4 42 40 41
5 44 45 43
私は、各場所で温度が30を超えていた年数になりたいです。例えば:
yr.above
1 0
2 0
3 2
4 3
5 3
私はいくつか試してみましたが、機能せず、かなり非論理的でした(たとえば、length(data [1:length(data)、which(blah blahは意味をなさない)を試みる)、またはapply(data、1、length (データ)> 30)、これらは意味をなさないことは知っていますが、少し行き詰っています。
これにより、探しているベクターが得られます。
rowSums(data > 30)
data
が行列かdata.frameのどちらでも動作します。また、ベクトル化された関数を使用するため、([遅い] for)ループ以上のapply
を使用するよりも好ましい方法です。
data
がdata.frameである場合、結果を列として追加できます:
data$yr.above <- rowSums(data > 30)
またはdata
が行列の場合:
data <- cbind(data, yr.above = rowSums(data > 30))
また、まったく新しいdata.frameを作成することもできます。
data.frame(yr.above = rowSums(data > 30))
またはまったく新しいマトリックス:
cbind(yr.above = rowSums(data > 30))
Applyの3番目の引数は関数である必要があります。また、合計で論理的な真を数えることができます。
apply(data, 1, function(x)sum(x > 30))
Reduce
および+
でも実行できます(NA要素がないと仮定)
Reduce(`+`, lapply(as.data.frame(data), `>`, 30))
matrix
に変換しないため、これは効率的なはずです。