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 utilizar una función de coincidencia con una función de mutación?

Estoy tratando de incrustar una función de coincidencia (o equivalente — acabo de migrar desde Excel donde hay un uso liberal de la función Match) dentro de un mutate(). Supongamos que comenzamos con un marco de datos df1 que se ve así, generado por el código que está debajo:

  ID Status
1  1      N
2  2      Y
3  3      Y
4  4      N
5  5      Y

df1 <- data.frame(
  ID = c(1,2,3,4,5),
  Status = c("N","Y","Y","N","Y")
)

Uso la función mutate() de dplyr para generar una nueva columna basada en el valor de la columna “Status” más a la derecha. A continuación se muestra el nuevo marco de datos tmp de salida y el código de dplyr que lo genera (este es un ejemplo muy simple que se aplica a mi problema más grande, simplemente sigue con este):

  ID Status Flag
1  1      N   No
2  2      Y  Yes
3  3      Y  Yes
4  4      N   No
5  5      Y  Yes

tmp <- 
  df1 %>% 
  mutate("Flag"=case_when(Status=="Y"~"Yes",TRUE~"No"))

Estoy tratando de incrustar el equivalente de una función de “match” en el mutate() anterior, de modo que el valor insertado en la columna “Flag” dependa del ID en el marco de datos df1 si coincide con el ID en estos otros 2 marcos de datos adicionales:

Status1 <- data.frame(ID = c(2,3))
Status2 <- data.frame(ID = c(5)) 

Entonces, por ejemplo, con una función de coincidencia de ID, mi resultado tmp se vería así:

  ID Status Flag             [Flag explicado]
1  1      N   No
2  2      Y  Yes - Status1   Ya que el ID en el marco de datos df1 coincide con uno de los ID's en el marco de datos Status1
3  3      Y  Yes - Status1   Igual que el caso anterior
4  4      N   No
5  5      Y  Yes - Status2   Ya que el ID en el marco de datos df1 coincide con el ID en el marco de datos Status2

¿Alguna idea para emparejar varios marcos de datos de esta manera en dplyr?

En los datos reales con los que estoy trabajando, hay 5 marcos de datos para emparejar, no solo 2 como en este ejemplo. Además, en mis 5 tablas de emparejamiento reales, todos los ID son mutuamente excluyentes (no hay ID repetidos en las tablas de emparejamiento). En mis datos reales, el equivalente de las columnas “Status” y “Flag” también son cadenas de caracteres, no valores numéricos.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Una forma de lograr esto es utilizando la función left_join() de dplyr para unir df1 con cada uno de los marcos de datos adicionales (Status1 y Status2). Luego, podemos utilizar las funciones case_when() e is.na() para especificar los valores de Flag en función de si hubo una coincidencia en cada tabla o no. Aquí está el código:

    library(dplyr)
    
    # Definir los marcos de datos adicionales
    Status1 <- data.frame(ID = c(2,3))
    Status2 <- data.frame(ID = c(5))
    
    # Unir df1 con cada marco de datos adicional
    df1_match1 <- left_join(df1, Status1, by = "ID")
    df1_match2 <- left_join(df1, Status2, by = "ID")
    
    # Utilizar case_when() e is.na() para especificar los valores de Flag
    tmp <- df1 %>%
      mutate(Flag = case_when(
        Status == "Y" & !is.na(df1_match1$ID) ~ "Yes - Status1",
        Status == "Y" & !is.na(df1_match2$ID) ~ "Yes - Status2",
        Status == "Y" ~ "Yes",
        TRUE ~ "No"
      ))
    

    El marco de datos resultante tmp tendrá la columna Flag con los valores especificados según las coincidencias en cada uno de los marcos de datos adicionales. Tenga en cuenta que utilizamos !is.na() para verificar las coincidencias, ya que left_join() devolverá valores NA para las filas que no coinciden en los marcos de datos unidos. Además, agregamos una tercera condición a la función case_when() para especificar el valor Flag como “Yes” en caso de que no haya coincidencias en los marcos de datos adicionales.

Comments are closed.