11 確認問題
11.2 Rの文法に関する問題
11.2.2 問題
Rのループ(forやwhile)内で、現在のループをスキップして次のループに進むために使用されるキーワードはどれか?
- next
- break
- skip
- continue
解答
正解は nextです。
break は、ループ自体を終了(中断)させるためのキーワードです。
skip や continue はRのループ制御キーワードではありません。
11.2.3 問題
以下のスクリプトを実行するとmean関数はNA
を返す。
xの平均値を計算するにはどう対処すればいいか?
解答
mean(x, na.rm = TRUE)
とすればよい。
na.rm
はNAを無視するかどうかのオプション(デフォルトはFALSE)であり、これをTRUEにすると入力データに含まれるNAは無視して計算できる。mean関数だけでなく、標準偏差を計算するsd()
関数など、他の多くの関数にも存在するオプションなので覚えておくとよい。
別の回答としては、mean(x[!is.na(x)])
などもある。
11.2.5 問題
以下の内容を持つデータフレームを作成し、productsという名前の変数に代入せよ。
- 1列目: 列名を name とし、“Apple”, “Banana”, “Cherry” という文字列を格納する。
- 2列目: 列名を price とし、100, 80, 120 という数値を格納する。
- 3列目: 列名を stock とし、TRUE, FALSE, TRUE という論理値を格納する。
11.2.8 問題
1から12までの連続する整数を使って、3行4列の行列を作成せよ。ただし、要素は行方向に(左から右へ、そして上の行から下の行へ)格納されるようにする。作成した行列は mat_A という変数に格納する。
11.2.9 問題
次のような機能を持つ関数を作成せよ。
- 引数xが正の値なら"Positive"という文字列を返す。
- 引数xが負の値なら"Negative"という文字列を返す。
- 引数xが0なら"Zero"という文字列を返す。
解答
my_func = function(x) {
if (x > 0) {
return("Positive")
} else if (x < 0) {
return("Negative")
} else {
return("Zero")
}
}
# 動作確認
my_func(10) # 正の値を引数にした場合
## [1] "Positive"
my_func(-2) # 負の値を引数にした場合
## [1] "Negative"
my_func(0) # 0を引数にした場合
## [1] "Zero"
まず、function()
を使って新しい関数を定義し、my_func という名前を付けています。この関数は x という一つの引数を受け取ります。関数に渡された値は、{}
の中で x という変数名で利用できます。次に、if
やelse
を使って条件分岐させています。return()
を使って関数の返り値を定めます。
11.2.10 問題
以下の sales_data データフレームがある。dplyr パッケージとパイプ演算子 %>% を使って、category ごとの amount の合計値を計算せよ。
sales_data = data.frame(
category = c("A", "B", "A", "C", "B", "A"),
amount = c(100, 150, 200, 50, 250, 300)
)
解答
sales_summary = sales_data %>%
dplyr::group_by(category) %>%
dplyr::summarise(total_amount = sum(amount))
print(sales_summary)
## # A tibble: 3 × 2
## category total_amount
## <chr> <dbl>
## 1 A 600
## 2 B 400
## 3 C 50
group_by(category)
で category 列の同じ値を持つ行をグループ化します。summarise(total_amount = sum(amount))
で、グループ化された各グループに対して集計処理を行います。ここでは sum(amount) で amount 列の合計を計算し、その結果を total_amount という新しい列に格納しています。
11.2.11 問題
データフレーム df1 と df2 を、共通のキー列 id を基準に結合(left join)せよ。
11.2.12 問題
以下のデータフレームには、「Tシャツ」(Tは全角)と「Tシャツ」(Tは半角)という表記揺れが存在します。半角のTに表記を統一せよ。
11.2.14 問題
1から20までの整数を順番にチェックする for ループを作成せよ。ループの中で、数値が15に達したらループを中断(break)し、「15が見つかったのでループを終了します。」と表示する。15に達するまでの数値は、ループの各反復で画面に出力する。
解答
上記のfor (i in 1:20)
で変数 i に1から20までの数値が順番に代入され、ループが実行されます。ループ内のif (i == 15)
という条件文で i が15かどうかをチェックします。条件が TRUE になると、メッセージを表示した後に break 文が実行されます。break は、それが含まれるループ(この場合は for ループ)を即座に中断する働きをします。そのため、i が15になった時点でループが終了し、16以降の数値は処理されません。