q19’s diary

日本語教育能力検定試験、エスペラント検定、HSKなどに言及するblogです。

Vectorにmax()やmin()をかませたかった

Rの話です。

Problem

同じ次元の2つのvectorを適当に用意します。

> n <- round(rnorm(8)) # 正規分布
> n
[1]  1 -1  0  1  2  1 -1  1
> u <- round(runif(8), 3) # 一様分布
> u
[1] 0.292 0.774 0.411 0.009 0.634 0.378 0.985 0.468

これら2つのvectorの各成分を比較して、大きい方の値をとるような3つ目のvectorを作りたくなりました。
つまり、各  i = 1, 2, ..., 8に対し  m_i = \max ( n_i, u_i) となるようなvector  mを作りたくなりました。

> max(n, u)
[1] 2

うまくいきませんでした。1

Solution

調べたら、pmax()とかいうのを使えばうまくいくことがわかりました。

> pmax(n, u)
[1] 1.000 0.774 0.411 1.000 2.000 1.000 0.985 1.000

このpmax()を使えば、vectorに対し正部分をとるような操作、すなわち、各成分の値が0以上ならその値を、0未満なら0をとるような操作も施せました。

> n
[1]  1 -1  0  1  2  1 -1  1
> pmax(n, 0)
[1] 1 0 0 1 2 1 0 1
> max(n, 0)
[1] 2

もちろんmin()やpmin()についても同様のことが言えます。


  1. 前回の記事よろしく、実際は8次元ではなく数百万〜数千万次元のvectorを扱っていたので、for文は避けたい、という気持ちがありました。