¿Cómo hacer vlookup y completar (como en Excel) en R?

Resuelto user2142810 asked hace 54 años • 9 respuestas

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 VLOOKUPy lo completaría.

¿Cómo haría para hacer lo mismo en R?

Básicamente, lo que tengo es una HouseTypevariable 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
user2142810 avatar Jan 01 '70 08:01 user2142810
Aceptado

Si entiendo su pregunta correctamente, aquí hay cuatro métodos para hacer el equivalente de Excel VLOOKUPy 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 HouseTypeNousando largetablelos valores de la lookuptabla:

Primero con mergeen 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 plyrpaquete:

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

Cuarto, usar el sqldfpaquete.

# 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 largetableno existan, lookupentonces 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.

Ben avatar Mar 09 '2013 05:03 Ben

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.

Ben Bolker avatar Oct 20 '2015 20:10 Ben Bolker