モモノキ&ナノネと一緒に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 件のコメント :
コメントを投稿