我有一个大约105000行和30列的数据集。我有一个分类变量,我想把它赋给一个数字。在Excel中,我可能会用VLOOKUP
和fill做一些事情。
我如何在R
中做同样的事情?
本质上,我拥有的是一个HouseType
变量,并且我需要计算HouseTypeNo
。以下是一些示例数据:
HouseType HouseTypeNo
Semi 1
Single 2
Row 3
Single 2
Apartment 4
Apartment 4
Row 3
发布于 2013-03-09 13:51:00
如果我没理解错你的问题,这里有四种方法可以用R
来做相当于Excel的VLOOKUP
和fill down
# 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
:
# 1. using base
base1 <- (merge(lookup, largetable, by = 'HouseType'))
在base中使用命名向量的第二种方法:
# 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")
如果lookup
中可能不存在largetable
中的某些房屋类型,则可以使用左连接:
sqldf("select * from largetable left join lookup using (HouseType)")
也需要对其他解决方案进行相应的更改。
这就是你想做的吗?让我知道你喜欢哪种方法,我会添加评论。
发布于 2015-10-21 04:34:30
我认为你也可以使用match()
largetable$HouseTypeNo <- with(lookup,
HouseTypeNo[match(largetable$HouseType,
HouseType)])
如果我打乱lookup
的顺序,这仍然有效。
发布于 2013-10-22 20:50:53
我也喜欢使用qdapTools::lookup
或速记二元运算符%l%
。它的工作方式与Excel vlookup相同,但它接受与列号相反的名称参数
## 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
https://stackoverflow.com/questions/15303283
复制相似问题