Caso 2. Celdas
En estos casos el problema están en las celdas, es decir, en las categorías/valor de las variables, porque, por ejemplo:
- Hay errores ortográficos o una misma categoría se ha transcrito en formas distintas
- El contenido no se entiende si no se posee el libro de códigos (las categorías son número, por ejemplo: 1, 2, 3)
- Hay la categoría de dos variables en una misma celda
- Acentos diacríticos o cualquier caracter que no todos los paquetes de R procesan correctamente
Caballos ganadores del Clásico Internacional del Caribe
Tengo un marco de dato sobre los caballos ganadores del Clásico del Caribe entre 1966 y 2012
head(caballos)
## n. anio sede ganador
## 1 I 1966 Puerto Rico San Juan Venezuela Victoreado
## 2 II 1967 Venezuela Caracas México El Comanche
## 3 III 1968 Puerto Rico San Juan Puerto Rico Wiso G.
## 4 IV 1969 México Ciudad de México México Guadamur
## 5 V 1970 Panamá Panamá México Hashin
## 6 VI 1971 Venezuela Caracas México Nacozareño
## jinete x
## 1 Venezuela Gustavo Ávila clasico internacional del caribe
## 2 México Rubén Contreras clasico internacional del caribe
## 3 Puerto Rico Carlos López clasico internacional del caribe
## 4 México Alberto Zepeda clasico internacional del caribe
## 5 México Miguel Yánez clasico internacional del caribe
## 6 Venezuela Guillermo Gavidia clasico internacional del caribe
En las columnas 3:5, que corresponde a las variables “Sede”, “Ganador”, “Jinete” hay dos variables por columna. En el primer caso, se ofrece el país y la ciudad del evento; en el segundo, el país del caballo ganador y el nombre del caballo; y en el último caso, el país del jinete ganador así como el nombre del jinete. Es necesario separar esas variables para que haya seis columnas en lugar de tres. Adicionalmente, puedo eliminar algunas variables que no me serían útiles para crear algún grafo
Separar el pais-sede y la ciudad-sede
Observo que los países sedes casualmene tienen largos diferentes. Eso me permitiría separar los países-sedes de la ciudad-sede tomando como referencia el largo de los caracteres. Para esto usaré la función ncha(), que cuenta el largo de caracteres, luego verifico el número máximo de caracteres presentes en cada celda, para proceder a la extracción. Para ello uso la función by(). Finalmente, con la función ifelse() y basándome en la información anterior, extraigo los nombres de los países sede del evento:
# elimino la columna x
caballos <-caballos[, -6]
# una posibilidad: saber el largo de cada caso
# para luego extraer la informacion
# creo una nueva variable para almacenar el largo
# de caracteres en cada celda
caballos$sede.car <-nchar(as.character(caballos$sede))
# verifico usando by
by(caballos$sede.car, caballos$sede, max)
## caballos$sede: la República Dominicana Santo Domingo
## [1] 38
## --------------------------------------------------------
## caballos$sede: México Ciudad de México
## [1] 24
## --------------------------------------------------------
## caballos$sede: México Tijuana
## [1] 15
## --------------------------------------------------------
## caballos$sede: Panamá Panamá
## [1] 14
## --------------------------------------------------------
## caballos$sede: Puerto Rico Canóvanas
## [1] 22
## --------------------------------------------------------
## caballos$sede: Puerto Rico San Juan
## [1] 21
## --------------------------------------------------------
## caballos$sede: Venezuela Caracas
## [1] 18
## --------------------------------------------------------
## caballos$sede: Venezuela Maracaibo
## [1] 20
## --------------------------------------------------------
## caballos$sede: Flag of Trinidad and Tobago.svg Arima
## [1] 37
# creo la variable sede.pais. Si la variable sede.car es
# igual a un numero específico, colocar el nombre, en caso
# contrario que no coloque ndada
caballos$sede.pais <-ifelse(caballos$sede.car == 38,
"rep.dominicana", "")
# aqui cambio un poco, ya que existe informacion en mi nueva
# variable. Entonces, si el valor de sede.car es igual a tanto
# colocar el nombre del pais, y si no es igual, colocar la
# informacion que ya esta
caballos$sede.pais <-ifelse(caballos$sede.car == 24,
"mexico", caballos$sede.pais)
caballos$sede.pais <-ifelse(caballos$sede.car == 15,
"mexico", caballos$sede.pais)
# los paises con dos sedes, empleo '|' que significa 'o'
caballos$sede.pais <-ifelse(caballos$sede.car == 18 | caballos$sede.car == 20,
"venezuela", caballos$sede.pais)
caballos$sede.pais <-ifelse(caballos$sede.car == 21 | caballos$sede.car == 22, "puerto rico", caballos$sede.pais)
caballos$sede.pais <-ifelse(caballos$sede.car == 14, "panama", caballos$sede.pais)
caballos$sede.pais <-ifelse(caballos$sede.car == 37, "trinidad.tobago", caballos$sede.pais)
Creo la variable sede-ciudad. El procedimiento anterior e aplicable también a este caso
# creo la variable sede.ciudad
caballos$sede.ciudad <-ifelse(caballos$sede.car == 21,
"san.juan", "")
caballos$sede.ciudad <-ifelse(caballos$sede.car == 24,
"cdad.mexico",
caballos$sede.ciudad)
caballos$sede.ciudad <-ifelse(caballos$sede.car == 15,
"tijuana", caballos$sede.ciudad)
caballos$sede.ciudad <-ifelse(caballos$sede.car == 18,
"caracas", caballos$sede.ciudad)
caballos$sede.ciudad <-ifelse(caballos$sede.car == 20,
"maracaibo", caballos$sede.ciudad)
caballos$sede.ciudad <-ifelse(caballos$sede.car == 37,
"arima", caballos$sede.ciudad)
caballos$sede.ciudad <-ifelse(caballos$sede.car == 14,
"panama", caballos$sede.ciudad)
caballos$sede.ciudad <-ifelse(caballos$sede.car == 22,
"canovanas", caballos$sede.ciudad)
caballos$sede.ciudad <-ifelse(caballos$sede.car == 38,
"sto.domingo",
caballos$sede.ciudad)
Elimino la columna sede.car, que ya cumplió su función
caballos <-caballos[, -6]
names(caballos)
## [1] "n." "anio" "sede" "ganador" "jinete"
## [6] "sede.pais" "sede.ciudad"
Separar pais del caballo ganador, del nombre del caballo
Ahora, arreglo la columna “Ganador”. En algunos casos usaré el paquete “stringr”. Voy a crear un vector separado del marco de datos para facilitar la comprensión del ejemplo:
require(stringr)
#extraigo la columna
ganador <-unlist(as.character(caballos$ganador))
#elimino el espacio inicial
ganador<-str_trim(ganador, "left")
Separo los nombres de acuerdo con el espacio entre ellos. Generalmente este procedimiento podría completarse usando la expresión **strsplit(ganador, " “)**; sin embargo en este caso no funciona bien:
# ejemplifico aplicando la funcion a los 12 primeros casos
strsplit(ganador, " ")[1:12]
## [[1]]
## [1] "Venezuela Victoreado"
##
## [[2]]
## [1] "México El" "Comanche"
##
## [[3]]
## [1] "Puerto" "Rico Wiso" "G."
##
## [[4]]
## [1] "México Guadamur"
##
## [[5]]
## [1] "México Hashin"
##
## [[6]]
## [1] "México Nacozareño"
##
## [[7]]
## [1] "Panamá Montecarlo"
##
## [[8]]
## [1] "Panamá Barremina"
##
## [[9]]
## [1] "México Teziutlán"
##
## [[10]]
## [1] "México Voy" "Por" "Uno"
##
## [[11]]
## [1] "Venezuela Huracán" "Sí"
##
## [[12]]
## [1] "México Ezgarta"
Debo buscar otra alternativa
# ejemplifico aplicando el corte por el espaciado \\s
strsplit(ganador, "\\s")[1:12]
## [[1]]
## [1] "Venezuela" "Victoreado"
##
## [[2]]
## [1] "México" "El" "Comanche"
##
## [[3]]
## [1] "Puerto" "Rico" "Wiso" "G."
##
## [[4]]
## [1] "México" "Guadamur"
##
## [[5]]
## [1] "México" "Hashin"
##
## [[6]]
## [1] "México" "Nacozareño"
##
## [[7]]
## [1] "Panamá" "Montecarlo"
##
## [[8]]
## [1] "Panamá" "Barremina"
##
## [[9]]
## [1] "México" "Teziutlán"
##
## [[10]]
## [1] "México" "Voy" "Por" "Uno"
##
## [[11]]
## [1] "Venezuela" "Huracán" "Sí"
##
## [[12]]
## [1] "México" "Ezgarta"
Este código funciona mejor, si bien tendremos que solucionar por separado dos o tres casos. Necesito quedarme ahora con la primera parte de la información:
sapply(strsplit(ganador, split="\\s"), "[[", 1)[1:12]
## [1] "Venezuela" "México" "Puerto" "México" "México"
## [6] "México" "Panamá" "Panamá" "México" "México"
## [11] "Venezuela" "México"
Puedo crear entonces la nueva variable denominada pais.ganador, por ejemplo, y corregir los nombres que no quedaron completos
#creo la nueva variable, llevandola a minuscula
pais.ganador <-tolower(sapply(strsplit(ganador,
split="\\s"), "[[", 1))
# corrijo, puerto rico, y republica dominicana
# busco y reemplazo la palabra que comienza y termina con 'la'
pais.ganador <-gsub("^la$", "rep.dominicana", pais.ganador)
# busco y reemplazo la palabra que empieza y termina
#con 'puerto'
pais.ganador <-gsub("^puerto$", "puerto.rico", pais.ganador)
El siguiente paso consiste en obtener el nombre de los caballos ganadores. Tendremos que dar algunos pasos adicionales para obtener el nombre completo
caballos.gan<-sapply(strsplit(ganador, split="\\s"), "[[", 2)
#cambio los caballos por posicion, por ejemplo
caballos.gan[2]
## [1] "El"
caballos.gan[2]<-"el comanche"
# en bloque, obtendre un mensaje de advertencia. NO pasa nada
caballos.gan[c(3,10,14,15,16,20, 21:24, 26,27,
33, 35, 38:41, 43,45)] <-c("Wiso G",
"Voy Por Uno",
"El Cómico",
"Guaybanex",
"Verset Dancer",
"Rayo Laser",
"Don Gabriel",
"Vuelve Candy B",
"Verset's Jet",
"EL Gran Nano",
"My Own Business",
"Gran Abuelo",
"Borrascoso",
"Ay Papá",
"Soy Conquistador",
"Sicótico",
"Water Jet",
"El de Chine")
## Warning in caballos.gan[c(3, 10, 14, 15, 16, 20, 21:24, 26, 27, 33, 35, :
## number of items to replace is not a multiple of replacement length
caballos.gan<- tolower(caballos.gan)
Agrego las dos variables al marco de datos
caballos<-data.frame(caballos, pais.ganador, caballos.gan)
head(caballos)
## n. anio sede ganador
## 1 I 1966 Puerto Rico San Juan Venezuela Victoreado
## 2 II 1967 Venezuela Caracas México El Comanche
## 3 III 1968 Puerto Rico San Juan Puerto Rico Wiso G.
## 4 IV 1969 México Ciudad de México México Guadamur
## 5 V 1970 Panamá Panamá México Hashin
## 6 VI 1971 Venezuela Caracas México Nacozareño
## jinete sede.pais sede.ciudad pais.ganador
## 1 Venezuela Gustavo Ávila puerto rico san.juan venezuela
## 2 México Rubén Contreras venezuela caracas méxico
## 3 Puerto Rico Carlos López puerto rico san.juan puerto.rico
## 4 México Alberto Zepeda mexico cdad.mexico méxico
## 5 México Miguel Yánez panama panama méxico
## 6 Venezuela Guillermo Gavidia venezuela caracas méxico
## caballos.gan
## 1 victoreado
## 2 el comanche
## 3 wiso g
## 4 guadamur
## 5 hashin
## 6 nacozareño
Separar el pais del jinete y el nombre del jinete
En la tercera variable que me interesa cambiar solo me importa el nombre del jinete ganador
jinete <-as.character(caballos$jinete)
head(jinete)
## [1] " Venezuela Gustavo Ávila" " México Rubén Contreras"
## [3] " Puerto Rico Carlos López" " México Alberto Zepeda"
## [5] " México Miguel Yánez" " Venezuela Guillermo Gavidia"
nombre<-sapply(strsplit(jinete, split="\\s"), "[[",3)
head(nombre)
## [1] "Gustavo" "Rubén" "Rico" "Alberto" "Miguel" "Guillermo"
apellidos <-sapply(strsplit(jinete, split="\\s"), "[[",4)
head(apellidos)
## [1] "Ávila" "Contreras" "Carlos" "Zepeda" "Yánez" "Gavidia"
Hay que hacer algunos pasos adicionales para obtener el nombre
jinete.gan <-tolower(paste(nombre, apellidos))
head(jinete.gan)
## [1] "gustavo ávila" "rubén contreras" "rico carlos"
## [4] "alberto zepeda" "miguel yánez" "guillermo gavidia"
#tenemos que modificar algunos nombres 3,15,16,24,26,27,34,38,40,41,43:45
# cambio los nombres asociados a puerto rico
a <-jinete[c(3, 15,16,24,26,27, 38, 40)]
a1<-sapply(strsplit(a, split="\\s"), "[[",4)
a1<-paste(a1, sapply(strsplit(a, split="\\s"), "[[",5))
a1[6]<-paste(a1[6], "garcia")
a1
## [1] "Carlos López" "Juan Santiago" "Santos Navarro"
## [4] "Julio García" "Juan Cintrón" "Julio A. garcia"
## [7] "Alexis Feliciano" "Héctor Berríos"
jinete.gan[c(3, 15,16,24,26,27, 38, 40)]<-a1
Hago lo mismo con los dos jinetes restantes
# Falta modifidcar 34, 41
jinete[c(34, 41)]
## [1] " los Estados Unidos Rosemary Homeister, Jr."
## [2] " la República Dominicana Joel Rosario"
jinete.gan[34] <-jinete.gan[34]<-
paste(sapply(strsplit(jinete[34],
split="\\s"),"[[",5),
sapply(strsplit(jinete[34],
split="\\s"),
"[[",6))
jinete.gan[41] <-jinete.gan[41]<-
paste(sapply(strsplit(jinete[41],
split="\\s"),"[[",5),
sapply(strsplit(jinete[41],
split="\\s"),
"[[",6))
jinete.gan <-tolower(jinete.gan)
head(jinete.gan)
## [1] "gustavo ávila" "rubén contreras" "carlos lópez"
## [4] "alberto zepeda" "miguel yánez" "guillermo gavidia"
En el código anterior he seguido un camino distintos. Posiblemente más corto, pero probablemente menos obvio. Tomo directamente el elemento 34 de la variable ‘jinete.gan’, y separo, y simultáneamente pego, el nombre y apellido del jinete ganador. Para obtener el nombre del pais del jinete sigo un procedimiento similar:
pais.jinete<-sapply(strsplit(jinete, split="\\s"), "[[",2)
#modifico puerto rico, estados unidos y republica dominicana
b1<-sapply(strsplit(a, split="\\s"), "[[",2)
b1<-paste(b1, sapply(strsplit(a, split="\\s"), "[[",3))
b1
## [1] "Puerto Rico" "Puerto Rico" "Puerto Rico" "Puerto Rico" "Puerto Rico"
## [6] "Puerto Rico" "Puerto Rico" "Puerto Rico"
pais.jinete[c(3, 15,16,24,26,27, 38, 40)]<-b1
Modifico los dos paises restantes
# Falta modifidcar 34, 41
pais.jinete[c(34, 41)]
## [1] "los" "la"
pais.jinete[34] <-pais.jinete[34]<-
paste(sapply(strsplit(jinete[34],
split="\\s"),"[[",3), sapply(strsplit(jinete[34],split="\\s"),
"[[",4))
pais.jinete[41] <-pais.jinete[41]<-
paste(sapply(strsplit(jinete[41],
split="\\s"),"[[",3), sapply(strsplit(jinete[41],split="\\s"),
"[[",4))
pais.jinete <-tolower(pais.jinete)
head(pais.jinete)
## [1] "venezuela" "méxico" "puerto rico" "méxico" "méxico"
## [6] "venezuela"
Finalmente, agrego las dos columnas a mi marco de datos. Nótese que en lugar de agregar las columnas creadas al marco de datos existente, podría haber generado uno nuevo.
caballos <-data.frame(caballos, pais.jinete, jinete.gan)
head(caballos)
## n. anio sede ganador
## 1 I 1966 Puerto Rico San Juan Venezuela Victoreado
## 2 II 1967 Venezuela Caracas México El Comanche
## 3 III 1968 Puerto Rico San Juan Puerto Rico Wiso G.
## 4 IV 1969 México Ciudad de México México Guadamur
## 5 V 1970 Panamá Panamá México Hashin
## 6 VI 1971 Venezuela Caracas México Nacozareño
## jinete sede.pais sede.ciudad pais.ganador
## 1 Venezuela Gustavo Ávila puerto rico san.juan venezuela
## 2 México Rubén Contreras venezuela caracas méxico
## 3 Puerto Rico Carlos López puerto rico san.juan puerto.rico
## 4 México Alberto Zepeda mexico cdad.mexico méxico
## 5 México Miguel Yánez panama panama méxico
## 6 Venezuela Guillermo Gavidia venezuela caracas méxico
## caballos.gan pais.jinete jinete.gan
## 1 victoreado venezuela gustavo ávila
## 2 el comanche méxico rubén contreras
## 3 wiso g puerto rico carlos lópez
## 4 guadamur méxico alberto zepeda
## 5 hashin méxico miguel yánez
## 6 nacozareño venezuela guillermo gavidia