Excelでよく利用される関数のひとつとしてVLOOKUP関数があります。VLOOKUP関数は指定した範囲の先頭列を検索し、検索条件に一致した行に関する指定した列番号の値を返すという関数です。
これと同じことをRで行います。 Rの基本機能のみでとても簡単にできます。
ExcelのVLOOKUP関数の機能
住所録(検索範囲)の中から、指定した名前(検索値)に一致する人の電話番号(列番号)を探す時などに使うことができます。
VLOOKUP(検索値, 検索範囲, 列番号, 検索の型)
- 検索値:検索したい値(名前、等)
- 検索範囲:検索したい範囲(住所録、等)。検索の対象は先頭列。
- 列番号:取り出したいデータの列番号(電話番号、等は何列目にあるか)
- 検索の型: 一致するデータが見つからない場合の処理の仕方の指定します。完全一致の場合はFALSE、近似一致の場合はTRUEを指定します。近似一致を指定(TRUEを指定)するには、検索範囲が昇順である必要があり、その場合の戻り値は検索値を超えない範囲の最大値となります。
RでExcelのVLOOKUP関数を実現する
住所録の中の名前から電話番号を検索します。以下のような住所録だとします。
name | tel | address | age |
---|---|---|---|
山田太郎 | 111-1111 | 東京都 | 20 |
山田花子 | 222-2222 | 埼玉県 | 25 |
鈴木一郎 | 333-3333 | 鹿児島県 | 18 |
田中学 | 444-4444 | 愛知県 | 22 |
鈴木一郎 | 555-5555 | 北海道 | 33 |
住所録はdata.frameで準備します。
## intersect, setdiff, setequal, union
df <- data.frame(
name = c("山田太郎", "山田花子", "鈴木一郎", "田中学", "鈴木一郎"),
tel =c("111-1111", "222-2222", "333-3333", "444-4444", "555-5555"),
address=c("東京都", "埼玉県", "鹿児島県", "愛知県", "北海道"),
age = c(20, 25, 18, 22, 33)
)
この中から山田花子さんの電話番号を検索してみます。
以下のコードで山田花子さんの電話番号を取り出すことができます。
df[df$name == "山田花子","tel"]
## [1] "222-2222"
解説
df$name == "山田花子"
## [1] FALSE TRUE FALSE FALSE FALSE
とすることで、name列の各行が山田花子と一致するかどうかの論理ベクトルが返ってきます(2行目)。
これを住所録(df)の行指定に与えて、“tel”列を取り出せば、山田花子さんの電話番号を取り出すことができます(2行目)。
これをまとめて書いたものが上記のコードです。
df[df$name == "山田花子","tel"]
## [1] "222-2222"
一致するデータがない場合
一致するデータがない場合、長さ0のcharacterが返ってきます(2行目)。これはVLOOKUP関数の第4引数をFALSEとした場合に相当します。
df[df$name == "渡辺健","tel"]
## character(0)
検索値を超えない範囲の最大値
VLOOKUP関数で4つめの引数をTRUEに指定した場合と同じことを実現してみます。検索値を超えない範囲の最大値を取り出すのは、少し面倒ですが、dplyr::filter関数を使うことで実施可能です。
「渡辺健」さんを超えない最大の名前の人の電話番号を取り出してみます。「渡辺健」さんを超えない最大の人というのがよくわからないので、VLOOKUP相当の処理をする前に、住所録に登録されている人の名前と「渡辺健」さんを一つのベクトルにまとめて、昇順に並び替えてみます。この結果から「渡辺健」さんを超えない最大の人の名前は「田中学」さんであることがわかります。
name_list <- c(df$name, "渡辺健")
sort(name_list) #昇順
## [1] "山田花子" "山田太郎" "田中学" "渡辺健" "鈴木一郎" "鈴木一郎"
「渡辺健」さんを超えない範囲で最大の人のデータは以下のコードで取り出すことができます。
library(dplyr)
df %>%
filter(name < "渡辺健") %>% # 「渡辺健」さんを超えない人のみ抽出
filter(name == max(name)) # その中で最大の人を抽出
結果は以下のようになります(田中学さんが取り出されています)。
name | tel | address | age |
---|---|---|---|
田中学 | 444-4444 | 愛知県 | 22 |
Rだとこんなこともできます
(case1)対象のキーワードが複数ある場合
住所録に「鈴木一郎」さんは2人います。「鈴木一郎」さんを検索対象とした場合、結果は該当する2件が返ってきます。
df[df$name == "鈴木一郎","tel"]
結果
## [1] "333-3333" "555-5555"
(case2)複数のキーワードで検索する
ExcelのVLOOKUP関数は検索対象は1つですが、Rでは複数指定することも可能です。「鈴木一郎」さんは鹿児島県と北海道にいます。以下のコードで、北海道に住んでいる人を取り出すことができます。
df[df$name == "鈴木一郎" & df$address == "北海道","tel"]
[1] "555-5555"
まとめ
Rはデータ分析にとても強い言語です。少し勉強すればExcelで行なっていたデータ分析作業は簡単にできるようになります。RとExcelでやれることの対応はこちら。