これはRの中でも大きな概念です。 その可能性を理解しやすくするために、さまざまな関数の入力と出力の次元を考えてみると役に立ちます。
すでに、ベクトルを受け取って単一のスカラー値のようなものを返す関数を見てきました。
> v <- 1:5
> length(v)
#> [1] 5
> sum(v)
#> [1] 15
統計関連の関数にもこのカテゴリーに属するものがたくさんあり、mean()もその1つです。
論理ベクトルに対しては、all()とany()があります。
Rの多くの関数はベクトル全体を対象に動作し、しばしばベクトルを出力します。 数学関数のほとんどがこれに当てはまります。
> sq <- c(4, 9, 16, 25)
> sqrt(sq) # square root
#> [1] 2 3 4 5
これは簡潔で便利なだけでなく、他の言語でよく使われるループやリスト内包表記、再帰を書かずに済みます。 Rでは、ベクトル関数はそうした手法よりもずっと速く動くことがよくあります。
ベクトルを並べ替えるには、値を返すsort()と、インデックスを返すorder()があります。
> v <- c("I", "am", "not", "in", "order")
> sort(v)
#> [1] "am" "I" "in" "not" "order"
> order(v)
#> [1] 2 1 4 3 5
デフォルトでは昇順に並べ替えます。
必要ならdecreasing = TRUEを指定するか、rev()を使って既存のベクトルを逆順にします。
v <- c("I", "am", "not", "in", "order")
sort(v, decreasing = TRUE)
#> [1] "order" "not" "in" "I" "am"
rev(1:4)
#> [1] 4 3 2 1
入力ベクトルを左から右へ処理して、累積的なベクトルを出力する関数もあります。
> cumsum(1:5)
#> [1] 1 3 6 10 15 # sums
> cumprod(1:5)
#> [1] 1 2 6 24 120 # equivalent to factorials
この概念を拡張すると、ベクトル同士を比較することもできます。
たとえば、ペアごとの最大値を求める関数pmax()を考えてみましょう。
> v
#> [1] 2 7 9
> w
#> [1] 3 1 5
> pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison
庭に何羽の鳥が訪れたかを、この7日間記録し続けている熱心なバードウォッチャーです。
タスクは6つあり、どれも庭に訪れた鳥の数に関するものです。
today()関数を実装して、今日庭に訪れた鳥の数を返します。鳥の数は日ごとに並んでいて、最初の要素が最も古い日の数、最後の要素が今日の数です。
birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1
increment_todays_count()関数を実装して、今日の数を1増やします。
birds_per_day <- c(2, 5, 0, 7, 4, 1)
increment_todays_count(birds_per_day)
# => c(2, 5, 0, 7, 4, 2)
has_day_without_birds()関数を実装します。鳥が1羽も庭に訪れなかった日があればTRUEを返し、そうでなければFALSEを返します。
birds_per_day <- c(2, 5, 0, 7, 4, 1)
has_day_without_birds(birds_per_day)
# => true
count_for_first_days()関数を実装します。これは、週の初めから庭に訪れた鳥の数を返しますが、数えるのは週の初めから指定された日数までに限定します。
birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14
日によっては、ほかの日より忙しいこともあります。忙しい日とは、庭に5羽以上の鳥が訪れた日のことです。
busy_days()関数を実装して、忙しい日の数を返します。
birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2
今週ここまでに、合計で何羽の鳥が訪れたのか気になりますね。 日ごとの累計を計算しましょう。
running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1] 7 13 18 22 25 27 28
鳥の訪問数は、近くの道路交通のパターン、つまり平日と週末の違いに影響されているのではないかと考えています。
日付の略称を、訪れた鳥の数の多い順、つまり_降順_に並べ替えましょう。
day_names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
birds_per_day <- c(5, 2, 4, 6, 0, 9, 8)
busy_days_of_week(birds_per_day, day_names)
#> [1] "Sat" "Sun" "Thu" "Mon" "Wed" "Tue" "Fri"