es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo hacer una búsqueda vertical (tipo vlookup) en R.

A continuación se muestra un ejemplo de datos. Se intenta agregar una nueva columna de datos “d202002” al marco de datos “old”, pero solo se hace cuando coinciden (naics 123400,123500,123700) con el naics 123600 que tiene valores en la columna “d202001” pero no en “d202002”. Estoy dando vueltas tratando de fusionar estos dos.

library(dplyr)
library(data.table)

naics <- c(123400,123500,123600,123700,123400,123500,123600,123700)
area <- c(000001,000001,000001,000001,000003,000003,000003,000003)
areatype <- c(04,04,04,04,04,04,04,04)
state <- c(32,32,32,32,32,32,32,32)
d202001 <- c(16,18,20,22,24,26,28,30)

old <- data.frame(naics,area,areatype,state,d202001)

naicsnew <- c(123400,123500,123700,123800,123900,123400,123500,123700,123800,123900)
areanew <- c(000001,000001,000001,000001,000001,000003,000003,000003,000003,000003)
areatypenew <- c(04,04,04,04,04,04,04,04,04,04)
statenew <- c(32,32,32,32,32,32,32,32,32,32)
d202002 <- c(17,19,21,23,41,35,36,37,38,45)

new <- data.frame(naicsnew,areanew,areatypenew,statenew,d202002)

Primer intento

new2 <- left_join(old,new, by = c("naics" = "naicsnew", "area" = "areanew", "areatype"="areatypenew","state"="statenew"))

A continuación se muestra el resultado deseado

   naics      area    areatype  state  d202001 d202002
1 123400        1          4     32      16      17
2 123500        1          4     32      18      19
3 123700        1          4     32      22      21
4 123400        3          4     32      24      35
5 123500        3          4     32      26      36
6 123700        3          4     32      30      38
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para agregar una nueva columna de datos d202002 al “antiguo” marco de datos, pero solo hacerlo cuando coinciden (naics 123400, 123500, 123700) con 123600 teniendo valores en la columna d202001 pero no d202002, podemos usar el siguiente código:

    “`{r}

    filtrar el nuevo marco de datos para incluir solo filas con naics coincidentes y valores no faltantes en d202001 pero faltantes en d202002

    new_filtered <- new %>% filter(naicsnew %in% c(123400, 123500, 123700) & !is.na(d202001) & is.na(d202002))

    unir a la izquierda el marco de datos nuevo filtrado con el antiguo marco de datos para agregar la nueva columna solo para las filas coincidentes

    result <- old %>% left_join(new_filtered %>% select(naicsnew, d202002) %>% rename(naics = naicsnew), by = “naics”)


    Este código primero filtra el nuevo marco de datos para incluir solo filas con naics coincidentes y valores no faltantes en d202001 pero faltantes en d202002. Luego, realiza una unión a la izquierda de este nuevo marco de datos filtrado con el antiguo marco de datos para agregar la nueva columna solo para las filas coincidentes. El resultado se almacena en el marco de datos `result`, que debería tener la estructura deseada: ```{r} # ver el resultado result
      naics   area areatype state d202001 d202002
    1 123400 000001        4    32      16      17
    2 123500 000001        4    32      18      19
    3 123600 000001        4    32      20    <na>
    4 123700 000001        4    32      22      21
    5 123400 000003        4    32      24      NA
    6 123500 000003        4    32      26      NA
    7 123600 000003        4    32      28    <na>
    8 123700 000003        4    32      30      NA
    

    Ten en cuenta que las filas con naics 123600 tienen valores faltantes en d202002 ya que no cumplen con la condición de tener un valor no faltante en d202001 en el código original.

Comments are closed.