¿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, 5 meses, 4 días - Por binarybuilder
2 Respuestas:
-
Para resolver este problema y unir los dos dataframes
data1
ydata2
manteniendo la variableID_Value
como tipocharacter
, puedes seguir estos pasos:- Transformar la variable
ID_Value
endata2
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
ydata2
:
R data.join <- leftjoin(data2, data1, by = c("Coding", "ID_Value", "Year"))
Con estos pasos, convertirás la variable
ID_Value
endata2
de notación científica a caracter y luego podrás unir los dos dataframes sin problemas manteniendoID_Value
como tipocharacter
. ¡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 - Transformar la variable
-
Para unir los dos marcos de datos
data1
ydata2
por las variablesCoding
eID_Value
manteniendoID_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 paquetedplyr
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 variablesID_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óndistinct()
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ónsprintf()
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