José Miguel Contreras
2011-Mar-20 19:38 UTC
[R-es] Reemplazar caracteres (nombres y apellidos) con tildes por vocales sin tildes.
Hola a todos, quisiera reemplazar caracteres (nombres y apellidos) con tildes por caracteres sin acentos. Ejemplo: "Ana" "Morales" "Díaz" "María José" "de la Fuente" "Pérez" Por "Ana" "Morales" "Diaz" "Maria Jose" "de la Fuente" "Perez" Y además si sabéis como coger una parte de los caracteres y ponerlos en otros "Maria Jose" "de la Fuente" "Perez" Por "Maria Jose de la" "Fuente" "Perez" Gracias [[alternative HTML version deleted]]
Jorge Ivan Velez
2011-Mar-20 20:18 UTC
[R-es] Reemplazar caracteres (nombres y apellidos) con tildes por vocales sin tildes.
Buenas tardes José Miguel,
La primera parte puedes hacerla con varios ifelse (ver codigo en la parte
inferior) o utilizando la funcion recode de car.
Combinar los nombres como describes en la segunda parte del email es un poco
mas complejo, pero una aproximacion seria la utilizacion de strsplit() en
combinacion con %in% y toupper().
Saludos,
Jorge Ivan Velez
# funcion para cambiar las tildes
# x es el nombre a cambiar
foo <- function(x){
x <- strsplit(x, '''')[[1]]
y <- ifelse(x == "á", ''a'',
ifelse(x == "é", ''e'',
ifelse(x == "í", ''i'',
ifelse(x == "ó", ''o'',
ifelse(x == "ú", ''u'', x)))))
paste(y, sep = "", collapse = "")
}
# ejemplo 1
x <- "María José"
x
foo(x)
# ejemplo 2 -- asumiendo que lees los nombres via read.table()
d <- data.frame(t(data.frame(
c("Ana", "Morales", "Díaz"),
c("María José", "de la Fuente", "Pérez")
)))
colnames(d) <- c(''Nombre'', ''Apellido1'',
''Apellido2'')
rownames(d) <- NULL
d
# transformacion
d[,] <- apply(d, 2, function(x) sapply(x, foo))
d
*
*
2011/3/20 José Miguel Contreras <>
>
> Hola a todos, quisiera reemplazar caracteres (nombres y apellidos) con
> tildes por caracteres sin acentos.
>
> Ejemplo:
>
> "Ana" "Morales" "Díaz"
>
> "María José" "de la Fuente" "Pérez"
>
> Por
>
> "Ana" "Morales" "Diaz"
>
> "Maria Jose" "de la Fuente" "Perez"
>
> Y además si sabéis como coger una parte de los caracteres y ponerlos en
> otros
>
> "Maria Jose" "de la Fuente" "Perez"
>
> Por
>
> "Maria Jose de la" "Fuente" "Perez"
>
> Gracias
>
>
> [[alternative HTML version deleted]]
>
>
> _______________________________________________
> R-help-es mailing list
> R-help-es@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>
>
[[alternative HTML version deleted]]
Carlos Ortega
2011-Mar-20 21:04 UTC
[R-es] Reemplazar caracteres (nombres y apellidos) con tildes por vocales sin tildes.
Hola, Utiliza la librería stringr() que sacó recientemente Hadley Wickham. Es una librería que permite la manipulación de cadenas de caracteres de una forma muy sencilla.> x<-c(''María'') > > str_replace_all(x,"í","i")[1] "Maria" Y para el segundo caso, la solución que veo es una ad hoc. Construída a base de juntar y separar las cadenas vía str_c (para juntar) y str_split (para separar).> y<-c("Maria Jose", "de la Fuente", "Perez") > z<-str_c(y[1],y[2],sep=" ") > z[1] "Maria Jose de la Fuente"> cadena_separa<-c('' la '') > w<-unlist(str_split(z,cadena_separa, n=2)) > w[1] "Maria Jose de" "Fuente"> w[1]<-str_c(w[1], cadena_separa) > w[1] "Maria Jose de la " "Fuente">Saludos, Carlos Ortega www.qualityexcellence.es 2011/3/20 José Miguel Contreras <jmcontreras@ugr.es>> > Hola a todos, quisiera reemplazar caracteres (nombres y apellidos) con > tildes por caracteres sin acentos. > > Ejemplo: > > "Ana" "Morales" "Díaz" > > "María José" "de la Fuente" "Pérez" > > Por > > "Ana" "Morales" "Diaz" > > "Maria Jose" "de la Fuente" "Perez" > > Y además si sabéis como coger una parte de los caracteres y ponerlos en > otros > > "Maria Jose" "de la Fuente" "Perez" > > Por > > "Maria Jose de la" "Fuente" "Perez" > > Gracias > > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >[[alternative HTML version deleted]]
guivivi en alumni.uv.es
2011-Mar-21 08:16 UTC
[R-es] Reemplazar caracteres (nombres y apellidos) con tildes por vocales sin tildes.
Hola José Miguel, Para lo de los acentos, yo también uso la función gsub():> a <- "Pérez" > a[1] "Pérez"> a <- gsub("Pérez", "Perez",a) > a[1] "Perez" Un saludo, Guillermo> > Hola a todos, quisiera reemplazar caracteres (nombres y apellidos) con > tildes por caracteres sin acentos. > > Ejemplo: > > "Ana" "Morales" "Díaz" > > "María José" "de la Fuente" "Pérez" > > Por > > "Ana" "Morales" "Diaz" > > "Maria Jose" "de la Fuente" "Perez" > > Y además si sabéis como coger una parte de los caracteres y ponerlos en > otros > > "Maria Jose" "de la Fuente" "Perez" > > Por > > "Maria Jose de la" "Fuente" "Perez" > > Gracias > > > [[alternative HTML version deleted]] > >
José Miguel Contreras
2011-Mar-21 14:56 UTC
[R-es] Reemplazar caracteres (nombres y apellidos) con tildes por vocales sin tildes.
Sigo con problemas a la hora de coger una parte de los caracteres y
ponerlos en otros cuando utilizo bucles
"Maria Jose" "de la Fuente" "Perez"
Por
"Maria Jose de la" "Fuente" "Perez"
Más o menos lo he conseguido utilizando el paquete stringr pero me dá un
error al final y cambia los datos por NA
> library(stringr)
> read.table("a.txt")->data
> data
V1 V2 V3
1 Ana Morales Díaz
2 Francisco Javier de la Fuente Izaguirre
3 María José Sánchez Perez
4 Jose M. Perez Sánchez
>
> as.data.frame(data)->data
>
> a=matrix(0,nrow(data),ncol(data))
>
> #Detecto donde está el ''de la''
>
> for(i in 1:nrow(data)) {
+ for(j in 1:ncol(data)) {
+ str_detect(data[i,j], "de la") -> a[i,j]
+ }
+ }
>
> #Reemplazar
>
> for(i in 1:nrow(data)) {
+ for(j in 1:ncol(data)) {
+ if(a[i,j]== 1){
+ b<-1:ncol(data)
+ z<-str_c(data[i,1],data[i,j],sep=" ")
+ cadena_separa<-c(''de la'')
+ w<-unlist(str_split(z,cadena_separa, n=2))
+ v<-unlist(str_split(z,w[2], n=2))
+ b[1]<- as.character(v[1])
+ b[2]<- as.character(w[2])
+ b[3:ncol(data)] =data[i,3:ncol(data)]
+ data[i,]<-paste(b[1],b[2],b[3:ncol(data)])
+ }
+ else data[i,j]<-data[i,j]
+ }
+ }
Mensajes de aviso perdidos
1: In `[<-.factor`(`*tmp*`, iseq, value = "Francisco Javier de la
Fuente 2") :
invalid factor level, NAs generated
2: In `[<-.factor`(`*tmp*`, iseq, value = "Francisco Javier de la
Fuente 2") :
invalid factor level, NAs generated
3: In `[<-.factor`(`*tmp*`, iseq, value = "Francisco Javier de la
Fuente 2") :
invalid factor level, NAs generated
>
> data
V1 V2 V3
1 Ana Morales Díaz
2 <NA> <NA> <NA>
3 María José Sánchez Perez
4 Jose M. Perez Sánchez
>
Hola a todos, quisiera reemplazar caracteres (nombres y apellidos) con
tildes por caracteres sin acentos.
Ejemplo:
"Ana" "Morales" "Díaz"
"María José" "de la Fuente" "Pérez"
Por
"Ana" "Morales" "Diaz"
"Maria Jose" "de la Fuente" "Perez"
Y además si sabéis como coger una parte de los caracteres y ponerlos en
otros
"Maria Jose" "de la Fuente" "Perez"
Por
"Maria Jose de la" "Fuente" "Perez"
Gracias
[[alternative HTML version deleted]]
Carlos Ortega
2011-Mar-21 20:32 UTC
[R-es] Reemplazar caracteres (nombres y apellidos) con tildes por vocales sin tildes.
Hola,
Prueba con este código que sí que permite la sustitución.
El problema con este código es que tan sólo modifica la cadena "de
la". Si
quisieras detectar los nombres y apellidos compuestos, habría que pensar en
otro algoritmo.
##############
data<-data.frame(
V1=c(''Ana'', ''Francisco Javier de
la'', ''María José'',''Jose
M''),
V2=c(''Morales'',''Fuente'',''Sánchez'',''Perez''),
V3=c(''Díaz'',''Izaguirre'',''Perez'',''Sánchez'')
)
data
cad_sep<-c(''de la'')
dat.new<-as.data.frame(matrix(0,nrow(data),ncol(data)))
cont<-0
for(i in 1:dim(data)[1]) {
for(j in 1:dim(data)[2]){
comp.dat<-str_detect(data[i,j],cad_sep)
if(comp.dat=="TRUE") {
dat.new[i,j]<-as.vector(str_replace(data[i,j],cad_sep,""))
cont<-1
} else {
if(cont==1) {
dat.new[i,j]<-as.vector(str_c(cad_sep,data[i,j],sep=" "))
cont<-0
} else {
dat.new[i,j]<-as.vector(data[i,j])
cont<-0
}
}
}
}
dat.new
dat.new[2,2]
###########################
Saludos,
Carlos Ortega
www.qualityexcellence.es
2011/3/21 José Miguel Contreras <jmcontreras@ugr.es>
> Sigo con problemas a la hora de coger una parte de los caracteres y
> ponerlos en otros cuando utilizo bucles
>
> "Maria Jose" "de la Fuente" "Perez"
>
> Por
>
> "Maria Jose de la" "Fuente" "Perez"
>
>
>
> Más o menos lo he conseguido utilizando el paquete stringr pero me dá un
> error al final y cambia los datos por NA
>
> > library(stringr)
> > read.table("a.txt")->data
> > data
> V1 V2 V3
> 1 Ana Morales Díaz
> 2 Francisco Javier de la Fuente Izaguirre
> 3 María José Sánchez Perez
> 4 Jose M. Perez Sánchez
> >
> > as.data.frame(data)->data
> >
> > a=matrix(0,nrow(data),ncol(data))
> >
> > #Detecto donde está el ''de la''
> >
> > for(i in 1:nrow(data)) {
> + for(j in 1:ncol(data)) {
> + str_detect(data[i,j], "de la") -> a[i,j]
> + }
> + }
> >
> > #Reemplazar
> >
> > for(i in 1:nrow(data)) {
> + for(j in 1:ncol(data)) {
> + if(a[i,j]== 1){
> + b<-1:ncol(data)
> + z<-str_c(data[i,1],data[i,j],sep=" ")
> + cadena_separa<-c(''de la'')
> + w<-unlist(str_split(z,cadena_separa, n=2))
> + v<-unlist(str_split(z,w[2], n=2))
> + b[1]<- as.character(v[1])
> + b[2]<- as.character(w[2])
> + b[3:ncol(data)] =data[i,3:ncol(data)]
> + data[i,]<-paste(b[1],b[2],b[3:ncol(data)])
> + }
> + else data[i,j]<-data[i,j]
> + }
> + }
> Mensajes de aviso perdidos
> 1: In `[<-.factor`(`*tmp*`, iseq, value = "Francisco Javier de la
> Fuente 2") :
> invalid factor level, NAs generated
> 2: In `[<-.factor`(`*tmp*`, iseq, value = "Francisco Javier de la
> Fuente 2") :
> invalid factor level, NAs generated
> 3: In `[<-.factor`(`*tmp*`, iseq, value = "Francisco Javier de la
> Fuente 2") :
> invalid factor level, NAs generated
> >
> > data
> V1 V2 V3
> 1 Ana Morales Díaz
> 2 <NA> <NA> <NA>
> 3 María José Sánchez Perez
> 4 Jose M. Perez Sánchez
> >
>
>
> Hola a todos, quisiera reemplazar caracteres (nombres y apellidos) con
> tildes por caracteres sin acentos.
>
> Ejemplo:
>
> "Ana" "Morales" "Díaz"
>
> "María José" "de la Fuente" "Pérez"
>
> Por
>
> "Ana" "Morales" "Diaz"
>
> "Maria Jose" "de la Fuente" "Perez"
>
> Y además si sabéis como coger una parte de los caracteres y ponerlos en
> otros
>
> "Maria Jose" "de la Fuente" "Perez"
>
> Por
>
> "Maria Jose de la" "Fuente" "Perez"
>
> Gracias
>
>
> [[alternative HTML version deleted]]
>
>
> _______________________________________________
> R-help-es mailing list
> R-help-es@r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>
>
[[alternative HTML version deleted]]