トラック
/
R
R
/
演習
/
バードウォッチャー
バードウォッチャー

バードウォッチャー

学習演習

はじめに

これは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つあり、どれも庭に訪れた鳥の数に関するものです。

1. 今日訪れた鳥の数を確認する

today()関数を実装して、今日庭に訪れた鳥の数を返します。鳥の数は日ごとに並んでいて、最初の要素が最も古い日の数、最後の要素が今日の数です。

birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1

2. 今日の数を増やす

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)

3. 鳥が訪れなかった日があるか確認する

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

4. 最初の指定日数に訪れた鳥の数を計算する

count_for_first_days()関数を実装します。これは、週の初めから庭に訪れた鳥の数を返しますが、数えるのは週の初めから指定された日数までに限定します。

birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14

5. 忙しい日の数を計算する

日によっては、ほかの日より忙しいこともあります。忙しい日とは、庭に5羽以上の鳥が訪れた日のことです。 busy_days()関数を実装して、忙しい日の数を返します。

birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2

6. この1週間の鳥の訪問数の累計を計算する

今週ここまでに、合計で何羽の鳥が訪れたのか気になりますね。 日ごとの累計を計算しましょう。

running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1]  7 13 18 22 25 27 28

7. 日付の名前を混雑度順に並べ替える

鳥の訪問数は、近くの道路交通のパターン、つまり平日と週末の違いに影響されているのではないかと考えています。

日付の略称を、訪れた鳥の数の多い順、つまり_降順_に並べ替えましょう。

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"
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
R Exercism

バードウォッチャーを始める準備はできましたか?

Exercismに登録すれば、21個のコンセプト111個の演習、そして本物の人間によるメンタリングとともに、Rを学んでマスターできます。すべて無料です。