Tenemos esta matriz:
ori<-matrix(c(1,1,0,0,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1),ncol=5,nrow=4)
rownames(ori)<-c("sp1","sp2","sp3","sp4")
colnames(ori)<-c("p1","p2","p3","p4","p5")> ori
p1 p2 p3 p4 p5
sp1 1 1 1 1 1
sp2 1 1 0 0 0
sp3 0 0 1 0 1
sp4 0 1 0 0 1
Lo que quiero es que R calcule cuantas veces coinciden las sp en los p.
El resultado que quiero obtener es:
sp1 sp2 sp3 sp4
sp1 5 2 2 2
sp2 2 2 0 1
sp3 2 0 2 1
sp4 2 1 1 2
Una matriz con el numero de veces que coinciden los sp en un p.
Lo que os pido es un poco de ayuda para mejorar lo que viene más abajo.
Estoy seguro que se puede hacer de una forma más elegante ¿Vectorizarlo se
dice? Seguro que hay una función de la familia de apply que sirve para hacer
estas cosas, pero no he encontrado nada.
Muchas gracias.
##comparaciones
#preparamos cositas
v.res<-0
matriu<-matrix(rep(0,12),ncol=4,nrow=4)
#a calcular
for(f in seq(1,nrow(ori))) #para cada fila (f)
{
for(n in seq(1,nrow(ori))) #compara con el resto de las filas (n)
{
r1<-ori[f,]==1 #que elementos de la fila f son iguales a 1
#r1
r2<-ori[n,]==1 #que elementos de la fila n son iguales a 1
#r2
com<-as.character(r1&r2) #que elementos son igual a 1 a la vez en la
fila
f y la fila n
#com
n.iguales<-length(com[com=="TRUE"]) #cuenta los elementos
iguales a 1 en
ambas filas
#n.iguales
v.res[n]<-n.iguales #pone el numero de iuales en un vector
#v.res
}
matriu[f,]<-v.res #para cafa fila f crea una fila en la matriz de los datos
con el vector resultado anterior
}
colnames(matriu)<-rownames(matriu)<-c("sp1","sp2","sp3","sp4")
#asigna
nombres a filas y columnas.
jaume
--
Jaume Tormo Blanes
IMEM Ramon Margalef.
Carretera San Vicente del Raspeig s/n
03690 San Vicente del Raspeig - Alicante
www.ua.es
acercad.wordpress.com
[[alternative HTML version deleted]]
Hola Jaume. Si sólo tienes unos y ceros, y no he entendido mal lo que quieres, puedes resolverlo así ori %*% t(ori) Un saludo. El 22 de octubre de 2010 13:46, Jaume Tormo <jautorbla@gmail.com> escribió:> Tenemos esta matriz: > > ori<-matrix(c(1,1,0,0,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1),ncol=5,nrow=4) > rownames(ori)<-c("sp1","sp2","sp3","sp4") > colnames(ori)<-c("p1","p2","p3","p4","p5") > > ori > p1 p2 p3 p4 p5 > sp1 1 1 1 1 1 > sp2 1 1 0 0 0 > sp3 0 0 1 0 1 > sp4 0 1 0 0 1 > > Lo que quiero es que R calcule cuantas veces coinciden las sp en los p. > El resultado que quiero obtener es: > > sp1 sp2 sp3 sp4 > sp1 5 2 2 2 > sp2 2 2 0 1 > sp3 2 0 2 1 > sp4 2 1 1 2 > > Una matriz con el numero de veces que coinciden los sp en un p. > Lo que os pido es un poco de ayuda para mejorar lo que viene más abajo. > Estoy seguro que se puede hacer de una forma más elegante ¿Vectorizarlo se > dice? Seguro que hay una función de la familia de apply que sirve para > hacer > estas cosas, pero no he encontrado nada. > > Muchas gracias. > > ##comparaciones > #preparamos cositas > v.res<-0 > matriu<-matrix(rep(0,12),ncol=4,nrow=4) > #a calcular > for(f in seq(1,nrow(ori))) #para cada fila (f) > { > for(n in seq(1,nrow(ori))) #compara con el resto de las filas (n) > { > r1<-ori[f,]==1 #que elementos de la fila f son iguales a 1 > #r1 > r2<-ori[n,]==1 #que elementos de la fila n son iguales a 1 > #r2 > com<-as.character(r1&r2) #que elementos son igual a 1 a la vez en la fila > f y la fila n > #com > n.iguales<-length(com[com=="TRUE"]) #cuenta los elementos iguales a 1 en > ambas filas > #n.iguales > v.res[n]<-n.iguales #pone el numero de iuales en un vector > #v.res > } > matriu[f,]<-v.res #para cafa fila f crea una fila en la matriz de los > datos > con el vector resultado anterior > } > colnames(matriu)<-rownames(matriu)<-c("sp1","sp2","sp3","sp4") #asigna > nombres a filas y columnas. > > > jaume > > -- > Jaume Tormo Blanes > IMEM Ramon Margalef. > Carretera San Vicente del Raspeig s/n > 03690 San Vicente del Raspeig - Alicante > www.ua.es > acercad.wordpress.com > > [[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]]
Buenos dias Jaume,
Ya Javier te dio una muy buena respuesta a tu pregunta en una sola linea.
Sin embargo, a continuacion te envio una nueva version de tu programa
inicial:
# datos
ori<-matrix(c(1,1,0,0,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1),ncol=5,nrow=4)
rownames(ori) <-
c("sp1","sp2","sp3","sp4")
# procesamiento
v.res<-0
matriu<-matrix(rep(0,12),ncol=4,nrow=4)
for(f in seq(1,nrow(ori))){
for(n in seq(1,nrow(ori))){
n.iguales <- sum(ori[f,]==1 & ori[n,]==1)
v.res[n] <- n.iguales
}
matriu[f,]<-v.res
}
Dependiendo de tus necesidades, podrias utilizar esta modificacion de tu
algoritmo o la enviada por Javier. A continuacion alguos tiempos; como
veras, la solucion de Javier es He aqui algunos tiempos:
# Modificada> system.time(replicate(10000,{
+ for(f in seq(1,nrow(ori))){
+ for(n in seq(1,nrow(ori))){
+ n.iguales <- sum(ori[f,]==1 & ori[n,]==1)
+ v.res[n] <- n.iguales
+ }
+ matriu[f,] <- v.res
+ }
+ }))
user system elapsed
3.278 0.045 4.011
# Javier> system.time(replicate(10000, {ori%*%t(ori)}))
user system elapsed
0.192 0.006 0.227
Un saludo,
Jorge Ivan Velez
2010/10/22 Jaume Tormo <>
> Tenemos esta matriz:
>
> ori<-matrix(c(1,1,0,0,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1),ncol=5,nrow=4)
>
rownames(ori)<-c("sp1","sp2","sp3","sp4")
>
colnames(ori)<-c("p1","p2","p3","p4","p5")
> > ori
> p1 p2 p3 p4 p5
> sp1 1 1 1 1 1
> sp2 1 1 0 0 0
> sp3 0 0 1 0 1
> sp4 0 1 0 0 1
>
> Lo que quiero es que R calcule cuantas veces coinciden las sp en los p.
> El resultado que quiero obtener es:
>
> sp1 sp2 sp3 sp4
> sp1 5 2 2 2
> sp2 2 2 0 1
> sp3 2 0 2 1
> sp4 2 1 1 2
>
> Una matriz con el numero de veces que coinciden los sp en un p.
> Lo que os pido es un poco de ayuda para mejorar lo que viene más abajo.
> Estoy seguro que se puede hacer de una forma más elegante ¿Vectorizarlo se
> dice? Seguro que hay una función de la familia de apply que sirve para
> hacer
> estas cosas, pero no he encontrado nada.
>
> Muchas gracias.
>
> ##comparaciones
> #preparamos cositas
> v.res<-0
> matriu<-matrix(rep(0,12),ncol=4,nrow=4)
> #a calcular
> for(f in seq(1,nrow(ori))) #para cada fila (f)
> {
> for(n in seq(1,nrow(ori))) #compara con el resto de las filas (n)
> {
> r1<-ori[f,]==1 #que elementos de la fila f son iguales a 1
> #r1
> r2<-ori[n,]==1 #que elementos de la fila n son iguales a 1
> #r2
> com<-as.character(r1&r2) #que elementos son igual a 1 a la vez en
la fila
> f y la fila n
> #com
> n.iguales<-length(com[com=="TRUE"]) #cuenta los elementos
iguales a 1 en
> ambas filas
> #n.iguales
> v.res[n]<-n.iguales #pone el numero de iuales en un vector
> #v.res
> }
> matriu[f,]<-v.res #para cafa fila f crea una fila en la matriz de los
> datos
> con el vector resultado anterior
> }
>
colnames(matriu)<-rownames(matriu)<-c("sp1","sp2","sp3","sp4")
#asigna
> nombres a filas y columnas.
>
>
> jaume
>
> --
> Jaume Tormo Blanes
> IMEM Ramon Margalef.
> Carretera San Vicente del Raspeig s/n
> 03690 San Vicente del Raspeig - Alicante
> www.ua.es
> acercad.wordpress.com
>
> [[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]]
Hola. Javier, eso sí que es simplificar %*%... aun no acabo de entender por que funciona, es lo que pasa por no prestar atención en las clases de algebra. Jorge, de momento son 0 y 1 pero puede que en el futuro sean más numeros, así me guardo tu sugerencia. Muchas gracias a los dos. El 22 de octubre de 2010 15:04, Jorge Ivan Velez <jorgeivanvelez@gmail.com>escribió:> Buenos dias Jaume, > > Ya Javier te dio una muy buena respuesta a tu pregunta en una sola linea. > Sin embargo, a continuacion te envio una nueva version de tu programa > inicial: > > # datos > ori<-matrix(c(1,1,0,0,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1),ncol=5,nrow=4) > rownames(ori) <- c("sp1","sp2","sp3","sp4") > > # procesamiento > v.res<-0 > matriu<-matrix(rep(0,12),ncol=4,nrow=4) > > for(f in seq(1,nrow(ori))){ > for(n in seq(1,nrow(ori))){ > n.iguales <- sum(ori[f,]==1 & ori[n,]==1) > v.res[n] <- n.iguales > } > matriu[f,]<-v.res > } > > Dependiendo de tus necesidades, podrias utilizar esta modificacion de tu > algoritmo o la enviada por Javier. A continuacion alguos tiempos; como > veras, la solucion de Javier es He aqui algunos tiempos: > > # Modificada > > system.time(replicate(10000,{ > + for(f in seq(1,nrow(ori))){ > + for(n in seq(1,nrow(ori))){ > + n.iguales <- sum(ori[f,]==1 & ori[n,]==1) > + v.res[n] <- n.iguales > + } > + matriu[f,] <- v.res > + } > + })) > user system elapsed > 3.278 0.045 4.011 > > # Javier > > system.time(replicate(10000, {ori%*%t(ori)})) > user system elapsed > 0.192 0.006 0.227 > > Un saludo, > Jorge Ivan Velez > > > 2010/10/22 Jaume Tormo <> > >> Tenemos esta matriz: >> >> ori<-matrix(c(1,1,0,0,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1),ncol=5,nrow=4) >> rownames(ori)<-c("sp1","sp2","sp3","sp4") >> colnames(ori)<-c("p1","p2","p3","p4","p5") >> > ori >> p1 p2 p3 p4 p5 >> sp1 1 1 1 1 1 >> sp2 1 1 0 0 0 >> sp3 0 0 1 0 1 >> sp4 0 1 0 0 1 >> >> Lo que quiero es que R calcule cuantas veces coinciden las sp en los p. >> El resultado que quiero obtener es: >> >> sp1 sp2 sp3 sp4 >> sp1 5 2 2 2 >> sp2 2 2 0 1 >> sp3 2 0 2 1 >> sp4 2 1 1 2 >> >> Una matriz con el numero de veces que coinciden los sp en un p. >> Lo que os pido es un poco de ayuda para mejorar lo que viene más abajo. >> Estoy seguro que se puede hacer de una forma más elegante ¿Vectorizarlo se >> dice? Seguro que hay una función de la familia de apply que sirve para >> hacer >> estas cosas, pero no he encontrado nada. >> >> Muchas gracias. >> >> ##comparaciones >> #preparamos cositas >> v.res<-0 >> matriu<-matrix(rep(0,12),ncol=4,nrow=4) >> #a calcular >> for(f in seq(1,nrow(ori))) #para cada fila (f) >> { >> for(n in seq(1,nrow(ori))) #compara con el resto de las filas (n) >> { >> r1<-ori[f,]==1 #que elementos de la fila f son iguales a 1 >> #r1 >> r2<-ori[n,]==1 #que elementos de la fila n son iguales a 1 >> #r2 >> com<-as.character(r1&r2) #que elementos son igual a 1 a la vez en la >> fila >> f y la fila n >> #com >> n.iguales<-length(com[com=="TRUE"]) #cuenta los elementos iguales a 1 en >> ambas filas >> #n.iguales >> v.res[n]<-n.iguales #pone el numero de iuales en un vector >> #v.res >> } >> matriu[f,]<-v.res #para cafa fila f crea una fila en la matriz de los >> datos >> con el vector resultado anterior >> } >> colnames(matriu)<-rownames(matriu)<-c("sp1","sp2","sp3","sp4") #asigna >> nombres a filas y columnas. >> >> >> jaume >> >> -- >> Jaume Tormo Blanes >> IMEM Ramon Margalef. >> Carretera San Vicente del Raspeig s/n >> 03690 San Vicente del Raspeig - Alicante >> www.ua.es >> acercad.wordpress.com >> >> [[alternative HTML version deleted]] >> >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es@r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> >> >-- Jaume Tormo Blanes IMEM Ramon Margalef. Carretera San Vicente del Raspeig s/n 03690 San Vicente del Raspeig - Alicante www.ua.es acercad.wordpress.com [[alternative HTML version deleted]]