[R-es] Construir matriz de distancias

Juan Abasolo ju@n@@b@@olo @ending from ehu@eu@
Vie Sep 7 11:38:38 CEST 2018


Me encantaría saber pensar así de una.
Creo que entiendo bien lo que me decís, pero no lo puedo poner en marcha en
mi computadora, por algo que no sé qué será.

Cuando llego a:
> cosa<-aline(w1=x,w2=y)
En RStudio me dice que R sufrió algo. Probé directamente desde la consola
linux y también:

> cosa<-aline(w1=x,w2=y)
*** stack smashing detected ***: /usr/lib/R/bin/exec/R terminated
Aborted

Supongo que ese es un problema que no tiene nada que ver con el original,
pero de alguna manera se juntó todo

Hau idatzi du Marcelino de la Cruz Rot (marcelino.delacruz using urjc.es)
erabiltzaileak (2018 ira. 7, or. (10:33)):

> Hola Juan,
>
> # No conozco ninguna función que haga lo que propones, pero no es muy
> difícil implementarlo en R.
> # Suponiendo que estos son tus datos de partida,
>
> x0<- c("cansado", "cansadisimo","cansau","reventado","reventao",NA,"canso")
> namesx0<-LETTERS[1:7]
>
>
> # Lo de los NA's deberías resolverlo (eliminarlos) al principio, es decir:
>
> ok<-!is.na(x0)
> x0.ok<-x0[ok]
> namesx0.ok<-namesx0[ok]
>
>
>
> # Una vez eliminados, como aline() calcula distancias entre elementos
> pareados de dos vectores, lo primero que tienes que hacer es justamente
> crear esos vectores con todos los valores pareados con todos
> x<- rep(x0.ok, length(x0.ok))
> y<-rep(x0.ok, each=length(x0.ok))
>
> # es decir,
> cbind(x,y)
>
> # ahora calculas la distancia aline entre los elementos
> cosa<-aline(w1=x,w2=y)
>
> # y lo formateas coo matriz simétrica
>
> cosa.m<- matrix(cosa, nr=length(x0.ok),nc=length(x0.ok))
> cosa.m
>
>
> # le pones los nombres a las filas y columnas
> dimnames(cosa.m)<-list(namesx0.ok, namesx0.ok)
> cosa.m
>
> # y lo presentas como matriz de distancias.
> as.dist(cosa.m)
>
>
>
> Aunque ya puestos, ¿porqué no implementarlo como una función?:
>
>
>
> aline.dist<- function(x0, namesx0){
>     require(alineR)
>     ok<-!is.na(x0)
>
>     x0.ok<-x0[ok]
>     namesx0.ok<-namesx0[ok]
>     x<- rep(x0.ok, length(x0.ok))
>     y<-rep(x0.ok, each=length(x0.ok))
>
>     cosa<-aline(w1=x,w2=y)
>
>     cosa.m<- matrix(cosa, nr=length(x0.ok),nc=length(x0.ok))
>    dimnames(cosa.m)<-list(namesx0.ok, namesx0.ok)
>    return(as.dist(cosa.m))
>
> }
>
>
> # A ver qué tal:
>
> aline.dist(x0, namesx0)
>
> Hmm, seguro que salen unos dendrogramas muy interesantes ;-)
>
> plot(hclust(aline.dist(x0, namesx0)))
>
>
>
>
> Saludos,
>
> Marcelino
>
>
> El 07/09/2018 a las 8:35, Juan Abasolo escribió:
> > ¡Buenas, listeros!
> >
> > Supongo que lo que planteo es muy básico, pero estoy trabado y no lo veo.
> >
> > Tengo una función que da la distancia lingüística ALINE, alineR::aline(),
> > pero que no genera matrices.
> >
> > Tengo que hacer matrices de distancias ALINE de unos datos tipo esto:
> >
> > A cansado
> > B cansadísimo
> > C cansau
> > D reventado
> > E reventao
> > F NA
> > G canso
> >
> > alineR::aline("cansado", "cansado")
> > # 0
> >
> > Necesito así, as.dist(miresultado)...
> >   A B C D ...
> > A 0
> > B 0.2 0
> > C 0.1 0 0
> > D 0.9 0.89 0
> > ...
> >
> > No sé si le puedo explicar a la función dist() o a alguna amiga suya que
> > method = "ALINE" quiere decir que use la función `aline()`. O si tengo
> que
> > intentar reinventar la rueda, pero con alineR::aline(x).
> >
> > También capaz que pueda evitar que aparezcan los NA sin mellar el
> trabajo.
> >
> > Gracias por la pacencia.
> >
>
> --
> Marcelino de la Cruz Rot
> Depto. de Biología y Geología
> Física y Química Inorgánica
> Universidad Rey Juan Carlos
> Móstoles España
>
>

-- 
Juan Abasolo

Hizkuntzaren eta Literaturaren Didaktika Saila
Bilboko Hezkuntza Fakultatea
Euskal Herriko Unibertsitatea
UPV/EHU

Sarriena auzoa z/g
48940 Leioa
Bizkaia

	[[alternative HTML version deleted]]



Más información sobre la lista de distribución R-help-es