該当者リスト

出席簿を作る

もともと存在するリスト(例えば学校の出席簿のようなもの)に、新たに項目を加えるには、left_join()やcbind()などの方法があるが、left_join()はキー項目以外のものをくっつける役割で、cbind()は行数が同じでないと用をなさない。

実際には、該当するもののリスト(たとえばイベントの出席者一覧)があって、元あるリストにくっつけたいことがある。

classmates = c("A001", "A002", "A003", "A004", "A005")   #元あるリスト
attend =  attend = c("A003", "A005")  #新しく加えたいリスト
hoge = if_else(classmates %in% attend, "Yeah", "Sorry")
hoge
[1] "Sorry" "Sorry" "Yeah"  "Sorry" "Yeah" 

以上の関係を使えば、データフレームに対して該当するリストをTRUE/FALSE(あるいはNA)で加えることが出来る。

データフレーム:classmatesに学籍番号numがあり、別に学籍番号のみ出席者リストanswerが与えられたと仮定し、項目attendanceとして追加する。

classmates %>% mutate(attendance = if_else(num %in% answer, "出席", "欠席"))   #出席/欠席はTRUE/FALSEでもよい。

自分がひかかっていたのは、num %in% answer が論理式であることを忘れ検索のためのコマンドと思い込んでいたことにある。

これを@スロプーさんに教わった時は目から鱗が落ちた。

%in%の挙動

> a = c(1,2,3)
> b = 1
> a %in% b
[1]  TRUE FALSE FALSE
> b %in% a
[1] TRUE