1. ホーム
  2. r

[解決済み] Rでvlookupとfill down(Excelのような)を行うには?

2022-03-07 18:31:49

質問

105000行、30列のデータセットがあります。カテゴリ変数があり、それを数値に割り当てたいと思います。Excelでは、おそらく次のようなことを行うでしょう。 VLOOKUP と記入します。

で同じことをするにはどうしたらいいでしょうか? R ?

本来、私が持っているのは HouseType 変数を計算する必要があります。 HouseTypeNo . 以下はサンプルデータです。

HouseType HouseTypeNo
Semi            1
Single          2
Row             3
Single          2
Apartment       4
Apartment       4
Row             3

解決方法は?

ご質問の内容を正しく理解するのであれば、Excelと同等のことを行う方法を4つご紹介します。 VLOOKUP を使い、塗り潰す。 R :

# load sample data from Q
hous <- read.table(header = TRUE, 
                   stringsAsFactors = FALSE, 
text="HouseType HouseTypeNo
Semi            1
Single          2
Row             3
Single          2
Apartment       4
Apartment       4
Row             3")

# create a toy large table with a 'HouseType' column 
# but no 'HouseTypeNo' column (yet)
largetable <- data.frame(HouseType = as.character(sample(unique(hous$HouseType), 1000, replace = TRUE)), stringsAsFactors = FALSE)

# create a lookup table to get the numbers to fill
# the large table
lookup <- unique(hous)
  HouseType HouseTypeNo
1      Semi           1
2    Single           2
3       Row           3
5 Apartment           4

を埋めるための4つのメソッドを紹介します。 HouseTypeNo の中に largetable の値を使って lookup テーブルを使用します。

最初に merge をベースにしたものです。

# 1. using base 
base1 <- (merge(lookup, largetable, by = 'HouseType'))

名前付きベクトルを基本にした2つ目のメソッド。

# 2. using base and a named vector
housenames <- as.numeric(1:length(unique(hous$HouseType)))
names(housenames) <- unique(hous$HouseType)

base2 <- data.frame(HouseType = largetable$HouseType,
                    HouseTypeNo = (housenames[largetable$HouseType]))

3つ目は plyr パッケージを使用します。

# 3. using the plyr package
library(plyr)
plyr1 <- join(largetable, lookup, by = "HouseType")

4つ目は sqldf パッケージ

# 4. using the sqldf package
library(sqldf)
sqldf1 <- sqldf("SELECT largetable.HouseType, lookup.HouseTypeNo
FROM largetable
INNER JOIN lookup
ON largetable.HouseType = lookup.HouseType")

の家型がある可能性があるのであれば、その家型に対応した largetable には存在しません。 lookup の場合、左結合が使用されます。

sqldf("select * from largetable left join lookup using (HouseType)")

他のソリューションにも対応した変更が必要でしょう。

それがあなたのやりたかったことですか?どの方法がいいか教えてくれれば、解説を付けます。