如何在R中完成VLOOKUP和填充(如Excel)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (68)

我有一个大约105000行30列的数据集。我有一个分类变量,我想把它分配给一个数字。在Excel中,我可能会用VLOOKUP然后填满。

我要怎么做同样的事R?

本质上,我拥有的是HouseType变量,我需要计算HouseTypeNo...。以下是一些样本数据:

HouseType HouseTypeNo
Semi            1
Single          2
Row             3
Single          2
Apartment       4
Apartment       4
Row             3
提问于
用户回答回答于

如果我正确理解了您的问题,下面是四种方法来完成Excel的等效操作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

下面是四种方法来填充HouseTypeNolargetable中的值。lookup表:

先与merge基地:

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

第二种方法,在基中有命名向量:

# 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]))

第三,使用plyr

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

第四,使用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)")

对其他解决方案也需要相应的修改。

用户回答回答于

我想你也可以用match():

largetable$HouseTypeNo <- with(lookup,
                     HouseTypeNo[match(largetable$HouseType,
                                       HouseType)])

扫码关注云+社区