¿Cómo hacer vlookup y completar (como en Excel) en R?
Tengo un conjunto de datos de aproximadamente 105000 filas y 30 columnas. Tengo una variable categórica que me gustaría asignarle a un número. En Excel, probablemente haría algo VLOOKUP
y lo completaría.
¿Cómo haría para hacer lo mismo en R
?
Básicamente, lo que tengo es una HouseType
variable y necesito calcular el HouseTypeNo
. Aquí hay algunos datos de muestra:
HouseType HouseTypeNo
Semi 1
Single 2
Row 3
Single 2
Apartment 4
Apartment 4
Row 3
Si entiendo su pregunta correctamente, aquí hay cuatro métodos para hacer el equivalente de Excel VLOOKUP
y completar usando 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
Aquí hay cuatro métodos para completar HouseTypeNo
usando largetable
los valores de la lookup
tabla:
Primero con merge
en base:
# 1. using base
base1 <- (merge(lookup, largetable, by = 'HouseType'))
Un segundo método con vectores con nombre en 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]))
Tercero, usando el plyr
paquete:
# 3. using the plyr package
library(plyr)
plyr1 <- join(largetable, lookup, by = "HouseType")
Cuarto, usar el sqldf
paquete.
# 4. using the sqldf package
library(sqldf)
sqldf1 <- sqldf("SELECT largetable.HouseType, lookup.HouseTypeNo
FROM largetable
INNER JOIN lookup
ON largetable.HouseType = lookup.HouseType")
Si es posible que algunos tipos de casas largetable
no existan, lookup
entonces se usaría una unión izquierda:
sqldf("select * from largetable left join lookup using (HouseType)")
También serían necesarios los cambios correspondientes en las otras soluciones.
¿Es eso lo que querías hacer? Déjame saber qué método te gusta y agregaré comentarios.
Creo que también puedes usar match()
:
largetable$HouseTypeNo <- with(lookup,
HouseTypeNo[match(largetable$HouseType,
HouseType)])
Esto todavía funciona si cambio el orden de lookup
.