首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在R中做vlookup和fill down (像Excel一样)?

如何在R中做vlookup和fill down (像Excel一样)?
EN

Stack Overflow用户
提问于 2013-03-09 05:05:54
回答 7查看 205.2K关注 0票数 93

我有一个大约105000行和30列的数据集。我有一个分类变量,我想把它赋给一个数字。在Excel中,我可能会用VLOOKUP和fill做一些事情。

我如何在R中做同样的事情?

本质上,我拥有的是一个HouseType变量,并且我需要计算HouseTypeNo。以下是一些示例数据:

代码语言:javascript
复制
HouseType HouseTypeNo
Semi            1
Single          2
Row             3
Single          2
Apartment       4
Apartment       4
Row             3
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-03-09 13:51:00

如果我没理解错你的问题,这里有四种方法可以用R来做相当于Excel的VLOOKUP和fill down

代码语言:javascript
复制
# 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

以下是使用largetable表中的值填充lookup中的HouseTypeNo的四种方法:

首先,在基础中使用merge

代码语言:javascript
复制
# 1. using base 
base1 <- (merge(lookup, largetable, by = 'HouseType'))

在base中使用命名向量的第二种方法:

代码语言:javascript
复制
# 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包:

代码语言:javascript
复制
# 3. using the plyr package
library(plyr)
plyr1 <- join(largetable, lookup, by = "HouseType")

第四,使用sqldf

代码语言:javascript
复制
# 4. using the sqldf package
library(sqldf)
sqldf1 <- sqldf("SELECT largetable.HouseType, lookup.HouseTypeNo
FROM largetable
INNER JOIN lookup
ON largetable.HouseType = lookup.HouseType")

如果lookup中可能不存在largetable中的某些房屋类型,则可以使用左连接:

代码语言:javascript
复制
sqldf("select * from largetable left join lookup using (HouseType)")

也需要对其他解决方案进行相应的更改。

这就是你想做的吗?让我知道你喜欢哪种方法,我会添加评论。

票数 128
EN

Stack Overflow用户

发布于 2015-10-21 04:34:30

我认为你也可以使用match()

代码语言:javascript
复制
largetable$HouseTypeNo <- with(lookup,
                     HouseTypeNo[match(largetable$HouseType,
                                       HouseType)])

如果我打乱lookup的顺序,这仍然有效。

票数 31
EN

Stack Overflow用户

发布于 2013-10-22 20:50:53

我也喜欢使用qdapTools::lookup或速记二元运算符%l%。它的工作方式与Excel vlookup相同,但它接受与列号相反的名称参数

代码语言:javascript
复制
## Replicate Ben's data:
hous <- structure(list(HouseType = c("Semi", "Single", "Row", "Single", 
    "Apartment", "Apartment", "Row"), HouseTypeNo = c(1L, 2L, 3L, 
    2L, 4L, 4L, 3L)), .Names = c("HouseType", "HouseTypeNo"), 
    class = "data.frame", row.names = c(NA, -7L))


largetable <- data.frame(HouseType = as.character(sample(unique(hous$HouseType), 
    1000, replace = TRUE)), stringsAsFactors = FALSE)


## It's this simple:
library(qdapTools)
largetable[, 1] %l% hous
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15303283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档