web-dev-qa-db-ja.com

各行の条件(>)によって列の数を数える

マトリックスの各行について、指定された値より大きい値を持つ列の数を計算しようとしています。私はこの単純な質問をしていることを残念に思いますが、私はそれを理解することができませんでした。

関心のあるいくつかの空間ポイントについて、複数年のラスターのラスタースタックから最大温度値を抽出しました。データは次のようになります。

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)、これらは意味をなさないことは知っていますが、少し行き詰っています。

32
Adam

これにより、探しているベクターが得られます。

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))
36
flodel

Applyの3番目の引数は関数である必要があります。また、合計で論理的な真を数えることができます。

apply(data, 1, function(x)sum(x > 30))
6
mengeln

Reduceおよび+でも実行できます(NA要素がないと仮定)

 Reduce(`+`, lapply(as.data.frame(data), `>`, 30))

matrixに変換しないため、これは効率的なはずです。

2
akrun