¿Problema con left_join o Cómo convertir el personaje (en forma científica) al personaje (en forma numérica)?

Quiero unir dos DFs por un par de variables. Todas las variables deben permanecer as.character. Sin embargo, uno se convierte en notación científica. La pregunta es, cómo me transformo data2$ID_Value para caracterizar a la forma "XX00000000"? Convertirse en numérico y unir obras, pero tengo que jugar con personajes.

# this works

data1 <- data1 %>% mutate(ID_Value = as.double(ID_Value))
data2 <- data2 %>% mutate(ID_Value = as.double(ID_Value))
data.join <- left_join(data2, data1, by = c("Coding", "ID_Value", "Year"))

#How to join with type(ID_Value) = as.character?

Aquí están los datos.

data1 <-
structure(list(Coding = c("PL01", "PL01", "PL02", "PL03", "PL03", 
"PL04", "PL05", "PL06", "PL07", "PL08", "PL09", "PL10", "PL10", 
"PL11", "PL13", "PL13", "PL14", "PL16", "PL17"), ID_Value = structure(c(1L, 
2L, 1L, 3L, 7L, 10L, 8L, 12L, 9L, 11L, 5L, 3L, 4L, 6L, 1L, 4L, 
2L, 11L, 7L), .Label = c("1100000000", "1140000000", "2120000000", 
"2240000000", "3060000000", "3200000000", "3260000000", "4300000000", 
"4320000000", "5020000000", "6040000000", "6220000000"), class = "factor"), 
    Year = c("2010", "2010", "2010", "2010", "2010", "2010", 
    "2010", "2010", "2010", "2010", "2010", "2010", "2010", "2010", 
    "2010", "2010", "2010", "2010", "2010"), `1814` = c(5787.88072428485, 
    27730.4960757182, 5787.88072428485, 8932.52590304165, 1977.15424781852, 
    22593.7415704718, 18845.7534728209, 10534.5762707541, 5722.88747773182, 
    6536.13205513642, 2706.63712073692, 8932.52590304165, 29410.372540196, 
    1774.21615143866, 5787.88072428485, 29410.372540196, 27730.4960757182, 
    6536.13205513642, 1977.15424781852)), row.names = c(NA, -19L
), class = c("tbl_df", "tbl", "data.frame"))

data2 <- 
structure(list(Coding = c("PL01", "PL01", "PL02", "PL03", "PL03", 
"PL04", "PL05", "PL06", "PL07", "PL08", "PL09", "PL10", "PL10", 
"PL11", "PL13", "PL13", "PL14", "PL16", "PL17"), ID_Value = structure(c(2L, 
1L, 2L, 3L, 6L, 10L, 9L, 12L, 8L, 11L, 5L, 3L, 4L, 7L, 2L, 4L, 
1L, 11L, 6L), .Label = c("1.14e+09", "1.1e+09", "2.12e+09", "2.24e+09", 
"3.06e+09", "3.26e+09", "3.2e+09", "4.32e+09", "4.3e+09", "5.02e+09", 
"6.04e+09", "6.22e+09"), class = "factor"), Year = c("2010", 
"2010", "2010", "2010", "2010", "2010", "2010", "2010", "2010", 
"2010", "2010", "2010", "2010", "2010", "2010", "2010", "2010", 
"2010", "2010")), row.names = c(NA, -19L), class = c("tbl_df", 
"tbl", "data.frame"))

Pregunta hecha hace 3 años, 4 meses, 28 días - Por binarybuilder


2 Respuestas:

  • Para resolver este problema y unir los dos dataframes data1 y data2 manteniendo la variable ID_Value como tipo character, puedes seguir estos pasos:

    • Transformar la variable ID_Value en data2 de notación científica a caracter:
    R
    data2 <- data2 %>% mutate(IDValue = format(as.numeric(levels(IDValue)[as.integer(ID_Value)], scientific = FALSE, trim = TRUE))
    

    • Realizar el leftjoin entre data1 y data2:
    R
    data.join <- leftjoin(data2, data1, by = c("Coding", "ID_Value", "Year"))
    

    Con estos pasos, convertirás la variable ID_Value en data2 de notación científica a caracter y luego podrás unir los dos dataframes sin problemas manteniendo ID_Value como tipo character. ¡Espero que esta solución te ayude a resolver tu problema!

    Respondida el Dec 19, 2020 a las 15:54 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para unir los dos marcos de datos data1 y data2 por las variables Coding e ID_Value manteniendo ID_Value como un carácter, puedes utilizar la siguiente modificación en el código:

    
    data3 <- data1 %>%
      left_join(data2, by = c("Coding", "ID_Value"))
    

    Este código utiliza la función left_join del paquete dplyr para unir los dos marcos de datos por las variables especificadas. La diferencia clave con el código que proporcionaste es que no se convierten las variables ID_Value a valores numéricos, lo que te permitirá mantener el formato de carácter.

    Ten en cuenta que si hay valores duplicados en la variable ID_Value en alguno de los marcos de datos, el resultado de la unión puede contener filas duplicadas. Puedes utilizar la función distinct() para eliminar filas duplicadas si es necesario.

    Además, si necesitas convertir la variable ID_Value a un carácter con formato "XX00000000", puedes utilizar la función sprintf() de la siguiente manera:

    
    data1 <- data1 %>%
      mutate(ID_Value = sprintf("%010d", as.integer(ID_Value)))
    
    
    data2 <- data2 %>%
      mutate(ID_Value = sprintf("%010d", as.integer(ID_Value)))
    

    Esto convertirá la variable ID_Value a un entero y luego lo formateará como una cadena de caracteres con 10 ceros a la izquierda.

    Respondida el Dec 19, 2020 a las 16:04 - por Gemini

    Votos positivos: 0 | Votos negativos: 0