モモノキ&ナノネと一緒にR関数の使い方を練習しよう

データの要素ごとに処理を適用できるsapply関数のキホン的使い方
ナノネ、統計解析用フリーソフト『R』の使い方を練習するよ。今回はapplyファミリーのひとつでsapply関数を使ってみよう。

apply関数はファミリーがあるだね。

applyファミリーには今回練習するsapplyのほかにも、lapply、tapply、mapplyというのもあるんだよ。

似たような名前がいくつもあってややこしいけど、今回はsapplyだね。

sapply関数はどんな処理ができるの?

引き数でデータ(オブジェクト)と関数を渡すと、データの各要素ごとに関数を適用してくれるよ。

sapply関数から返ってくるデータ型はベクトルか行列もしくはリストで、状況に応じて変わるよ。可能なら、ベクトルか行列を優先して返す仕様みたいだよ。

挙動がよくわかんないから、実際に試してみて。

OK、sapply関数は第1引数にデータ(オブジェクト)、第2引数に関数を指定すれば実行できるよ(第3引数以降は第2引数に指定した関数の第2引数以降に利用できるんだけど、ややこしいから今回は扱わないよ)。

最初はベクトルデータをsapply関数に渡してみよう。引数の関数は単純に入力値を2倍するだけにするね。

X_vector <- c(1, 2, 3, 4, 5) # ベクトルデータ
print(X_vector)
class(X_vector)
result <- sapply(X_vector, function(x){x * 2})
print(result)
class(result)
ベクトルの各要素がそれぞれ2倍された。返りの型もベクトル。

次は要素1個のリストをデータとして渡してみよう。

X_list1 <- list(1:5) # リストデータ
print(X_list1)
class(X_list1)
result <- sapply(X_list1, function(x){x * 2})
print(result)
class(result)
リストの中身が全部2倍された。返りの型は行列になってる。

次は要素2個のリストをデータとして渡してみよう。

X_list2 <- list(1:5, 6:10) # リストデータ
print(X_list2)
class(X_list2)
result <- sapply(X_list2, function(x){x * 2})
print(result)
class(result)
さっきと一緒でリストの中身が全部2倍されて、返りの型が行列。

次は長さの違うリストをデータとして渡してみよう。

X_list3 <- list(1:5, 1:10) # リストデータ
print(X_list3)
class(X_list3)
result <- sapply(X_list3, function(x){x * 2})
print(result)
class(result)
リストの中身が全部2倍されたのは一緒だけど、返りの型はリスト。違う長さでは行列が作れないからリストで返るのね。

引数の関数をsumに変更すれば、リスト要素ごとに合計してくれそうだよ。

X_list3 <- list(1:5, 1:10) # リストデータ
print(X_list3)
class(X_list3)
result <- sapply(X_list3, sum)
print(result)
class(result)
リスト要素ごとに合計できた。返りの型はベクトルだ。

次は行列をデータとして渡してみよう。

X_matrix <- matrix(1:12, ncol=4) # 行列データ
print(X_matrix)
class(X_matrix)
result <- sapply(X_matrix, function(x){x * 2})
print(result)
class(result)
行列の全要素が2倍されて、ベクトルで返ってきたね。

次はリストでベクトルと行列をデータとして渡してみよう。

X_list4 <- list(1:5, matrix(1:12, ncol=4)) # リストデータ
print(X_list4)
class(X_list4)
result <- sapply(X_list4, function(x){x * 2})
print(result)
class(result)
全部の要素が2倍されるのはどれも一緒で、返りの型もリスト。

最後は試しにデータフレームを渡してみよう。

X_df <- data.frame(x1=1:5, x2=6:10, x3=11:15) # データフレーム
print(X_df)
class(X_df)
result <- sapply(X_df, function(x){x * 2})
print(result)
class(result)
データフレームでも動きは一緒だね。行列で返ってきた。

要素ごとに何か処理を実行したときは、sapply関数を使えばいいのね。

あと、返りのデータ型がベクトルや行列が優先されるのもsapplyのポイントだよ。ファミリーのlapply関数はリスト型で返すみたいだから。

引数の関数にひと手間を加えたり、関数を組み合わせたりするとsapply関数でいろんな処理ができそう。sapply関数を使えるように練習してみるよ。

sapply関数の練習は以上で。
またね!

0 件のコメント :
コメントを投稿