Rでデータ解析を始めよう012 sapply関数のキホン的な使い方

Rでデータ解析を始めよう012 sapply関数のキホン的な使い方

モモノキ&ナノネと一緒に統計ソフトRの使い方を学習していきます。

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





データの要素ごとに処理を適用できるsapply関数のキホン的使い方

ナノネ、統計解析用フリーソフト『R』の使い方を練習するよ。今回はapplyファミリーのひとつでsapply関数を使ってみよう。

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

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

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

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

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

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

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

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

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

In [5]:
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)
[1] 1 2 3 4 5
'numeric'
[1]  2  4  6  8 10
'numeric'

ベクトルの各要素がそれぞれ2倍された。返りの型もベクトル。

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

In [6]:
X_list1 <- list(1:5) # リストデータ
print(X_list1)
class(X_list1)

result <- sapply(X_list1, function(x){x * 2})
print(result)
class(result)
[[1]]
[1] 1 2 3 4 5

'list'
     [,1]
[1,]    2
[2,]    4
[3,]    6
[4,]    8
[5,]   10
'matrix'

リストの中身が全部2倍された。返りの型は行列になってる。

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

In [7]:
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)
[[1]]
[1] 1 2 3 4 5

[[2]]
[1]  6  7  8  9 10

'list'
     [,1] [,2]
[1,]    2   12
[2,]    4   14
[3,]    6   16
[4,]    8   18
[5,]   10   20
'matrix'

さっきと一緒でリストの中身が全部2倍されて、返りの型が行列。

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

In [9]:
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)
[[1]]
[1] 1 2 3 4 5

[[2]]
 [1]  1  2  3  4  5  6  7  8  9 10

'list'
[[1]]
[1]  2  4  6  8 10

[[2]]
 [1]  2  4  6  8 10 12 14 16 18 20

'list'

リストの中身が全部2倍されたのは一緒だけど、返りの型はリスト。違う長さでは行列が作れないからリストで返るのね。

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

In [10]:
X_list3 <- list(1:5, 1:10) # リストデータ
print(X_list3)
class(X_list3)

result <- sapply(X_list3, sum)
print(result)
class(result)
[[1]]
[1] 1 2 3 4 5

[[2]]
 [1]  1  2  3  4  5  6  7  8  9 10

'list'
[1] 15 55
'integer'

リスト要素ごとに合計できた。返りの型はベクトルだ。

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

In [16]:
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)
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
'matrix'
 [1]  2  4  6  8 10 12 14 16 18 20 22 24
'numeric'

行列の全要素が2倍されて、ベクトルで返ってきたね。

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

In [17]:
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)
[[1]]
[1] 1 2 3 4 5

[[2]]
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12

'list'
[[1]]
[1]  2  4  6  8 10

[[2]]
     [,1] [,2] [,3] [,4]
[1,]    2    8   14   20
[2,]    4   10   16   22
[3,]    6   12   18   24

'list'

全部の要素が2倍されるのはどれも一緒で、返りの型もリスト。

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

In [18]:
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)
  x1 x2 x3
1  1  6 11
2  2  7 12
3  3  8 13
4  4  9 14
5  5 10 15
'data.frame'
     x1 x2 x3
[1,]  2 12 22
[2,]  4 14 24
[3,]  6 16 26
[4,]  8 18 28
[5,] 10 20 30
'matrix'

データフレームでも動きは一緒だね。行列で返ってきた。

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

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

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

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





スポンサーリンク

0 件のコメント :

コメントを投稿