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")> orip1 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]]