Hola, Estoy tratando de comparar dos data frames que son iguales si tienen las mismas filas, pero están desordenados tanto por filas como por columnas. Además no tienen ninguna columna con valores únicos por lo que no puedo ordenar en función de ninguna columna. he visto no obstante que la combinación de dos columnas si tiene valores únicos, por lo que para la comparación hice esto: Valores originales:> xgeneid array signal flag 1 1 array1 10 true 2 1 array2 11 false 3 2 array1 12 true 4 2 array2 13 false 5 3 array1 14 true 6 3 array2 15 false> yflag geneid signal array 1 true 3 14 array1 2 true 1 10 array1 3 false 2 13 array2 4 true 2 12 array1 5 false 3 15 array2 6 false 1 11 array2 Primero ordeno las columnas: x <- x[ , sort( colnames( x ) ) ] y <- y[ , sort( colnames( y ) ) ] Luego ordeno la combinación de las columnas que forman valores únicos: kk <- cbind( y, "orden" = paste( y[ , "geneid" ], y[ , "array" ], sep "" ) ) ordenado <- y[ order( kk$orden ) , ] Los objetos ordenado y x son exactamente iguales pero al hacer esto: library( RUnit ) checkEquals( ordenado, x ) Obtengo que son diferentes, ¿Alguien sabe porqué? Es lo que yo siempre utilizo para ver si dos objetos grandes son o no iguales, pero en este caso parece no funcionar... Gracias, un saludo [[alternative HTML version deleted]]
No se realmente, pero lo que yo había hecho es ver el resultado de str(x) str(ordenado) también attributes(x) attributes(ordenado) Probablemente esto muestra el problema! Mire también identical(x, ordenado) Kjetil 2009/3/25 Usuario R <r.user.spain en gmail.com>:> Hola, > > Estoy tratando de comparar dos data frames que son iguales si tienen las > mismas filas, pero están desordenados tanto por filas como por columnas. > Además no tienen ninguna columna con valores únicos por lo que no puedo > ordenar en función de ninguna columna. he visto no obstante que la > combinación de dos columnas si tiene valores únicos, por lo que para la > comparación hice esto: > > Valores originales: > >> x > geneid array signal flag > 1 1 array1 10 true > 2 1 array2 11 false > 3 2 array1 12 true > 4 2 array2 13 false > 5 3 array1 14 true > 6 3 array2 15 false >> y > flag geneid signal array > 1 true 3 14 array1 > 2 true 1 10 array1 > 3 false 2 13 array2 > 4 true 2 12 array1 > 5 false 3 15 array2 > 6 false 1 11 array2 > > > Primero ordeno las columnas: > > x <- x[ , sort( colnames( x ) ) ] > y <- y[ , sort( colnames( y ) ) ] > > Luego ordeno la combinación de las columnas que forman valores únicos: > > kk <- cbind( y, "orden" = paste( y[ , "geneid" ], y[ , "array" ], sep > "" ) ) > ordenado <- y[ order( kk$orden ) , ] > > Los objetos ordenado y x son exactamente iguales pero al hacer esto: > > library( RUnit ) > checkEquals( ordenado, x ) > > > Obtengo que son diferentes, ¿Alguien sabe porqué? Es lo que yo siempre > utilizo para ver si dos objetos grandes son o no iguales, pero en este caso > parece no funcionar... > > Gracias, un saludo > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >-- "Mathematics is not the rigid and rigidity-producing schema that the layman thinks it is; rather, in it we find ourselves at that meeting point of constraint and freedom that is the very essence of human nature." - Hermann Weyl
Buenos dias, El problema está en el nombre de las filas. En ''x'' estas son seq(6), mientras en ''ordenado'' con c(2,6,4,3,1,5).> all.equal(ordenado,x)[1] "Attributes: < Component 2: 6 string mismatches >" Al cambiar este atributo haciendo> rownames(ordenado)<-rownames(x)se obtiene, finalmente:> all.equal(ordenado,x)[1] TRUE Espero sea de utilidad, --JIV Jorge Ivan Velez [E] jorgeivanvelez+at+gmail+dot+com 2009/3/25 Usuario R <r.user.spain@gmail.com>> Hola, > > Estoy tratando de comparar dos data frames que son iguales si tienen las > mismas filas, pero están desordenados tanto por filas como por columnas. > Además no tienen ninguna columna con valores únicos por lo que no puedo > ordenar en función de ninguna columna. he visto no obstante que la > combinación de dos columnas si tiene valores únicos, por lo que para la > comparación hice esto: > > Valores originales: > > > x > geneid array signal flag > 1 1 array1 10 true > 2 1 array2 11 false > 3 2 array1 12 true > 4 2 array2 13 false > 5 3 array1 14 true > 6 3 array2 15 false > > y > flag geneid signal array > 1 true 3 14 array1 > 2 true 1 10 array1 > 3 false 2 13 array2 > 4 true 2 12 array1 > 5 false 3 15 array2 > 6 false 1 11 array2 > > > Primero ordeno las columnas: > > x <- x[ , sort( colnames( x ) ) ] > y <- y[ , sort( colnames( y ) ) ] > > Luego ordeno la combinación de las columnas que forman valores únicos: > > kk <- cbind( y, "orden" = paste( y[ , "geneid" ], y[ , "array" ], sep > "" ) ) > ordenado <- y[ order( kk$orden ) , ] > > Los objetos ordenado y x son exactamente iguales pero al hacer esto: > > library( RUnit ) > checkEquals( ordenado, x ) > > > Obtengo que son diferentes, ¿Alguien sabe porqué? Es lo que yo siempre > utilizo para ver si dos objetos grandes son o no iguales, pero en este caso > parece no funcionar... > > Gracias, un saludo > > [[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]]
Te propongo un método sistemático. Para ilustrarlo, a continuación reproduzco tu ejemplo: > A = data.frame(geneid=c(1,1,2,2,3,3),array=rep(c ("array1","array2"),3),signal=10:15,flag=rep(c("true","false"),3)) > A geneid array signal flag 1 1 array1 10 true 2 1 array2 11 false 3 2 array1 12 true 4 2 array2 13 false 5 3 array1 14 true 6 3 array2 15 false > B = A[c(5,1,4,3,6,2) , c(4,1,3,2)] #La matriz B es el resultado de una permutación de las columnas y filas de A > B flag geneid signal array 5 true 3 14 array1 1 true 1 10 array1 4 false 2 13 array2 3 true 2 12 array1 6 false 3 15 array2 2 false 1 11 array2 Para comprobar la equivalencia de ambos data.frame, > A2=A[,order(colnames(A))] ; B2=B[,order(colnames(B))] #Primero, se ordenan las columnas de A y B > identical(A2,B2) [1] FALSE > A3=A2[ do.call(order, A2) ,]; B3=B2[ do.call(order, B2) ,] #..... y luego las filas Finalmente, se obtiene el resultado esperado > identical(A3,B3) [1] TRUE -- ____________________________________ Olivier G. Nuñez Email: onunez@iberstat.es Tel : +34 663 03 69 09 Web: http://www.iberstat.es ____________________________________ El 25/03/2009, a las 14:44, Usuario R escribió:> Hola, > > Estoy tratando de comparar dos data frames que son iguales si > tienen las > mismas filas, pero están desordenados tanto por filas como por > columnas. > Además no tienen ninguna columna con valores únicos por lo que no > puedo > ordenar en función de ninguna columna. he visto no obstante que la > combinación de dos columnas si tiene valores únicos, por lo que > para la > comparación hice esto: > > Valores originales: > >> x > geneid array signal flag > 1 1 array1 10 true > 2 1 array2 11 false > 3 2 array1 12 true > 4 2 array2 13 false > 5 3 array1 14 true > 6 3 array2 15 false >> y > flag geneid signal array > 1 true 3 14 array1 > 2 true 1 10 array1 > 3 false 2 13 array2 > 4 true 2 12 array1 > 5 false 3 15 array2 > 6 false 1 11 array2 > > > Primero ordeno las columnas: > > x <- x[ , sort( colnames( x ) ) ] > y <- y[ , sort( colnames( y ) ) ] > > Luego ordeno la combinación de las columnas que forman valores únicos: > > kk <- cbind( y, "orden" = paste( y[ , "geneid" ], y[ , > "array" ], sep > "" ) ) > ordenado <- y[ order( kk$orden ) , ] > > Los objetos ordenado y x son exactamente iguales pero al hacer esto: > > library( RUnit ) > checkEquals( ordenado, x ) > > > Obtengo que son diferentes, ¿Alguien sabe porqué? Es lo que yo siempre > utilizo para ver si dos objetos grandes son o no iguales, pero en > este caso > parece no funcionar... > > Gracias, un saludo > > [[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, En mi respuesta de ayer cometí un error (gracias a Olivier Nuñez por hacerme notarlo). El problema está, más que en el nombre de las filas, en su orden. Esta nueva versión permite comparar ambos data frames (x y ordenado, ahora llamados A y B, respectivamente): # Datos originales A<-structure(list(geneid = c(1, 1, 2, 2, 3, 3), array = structure(c(1L, 2L, 1L, 2L, 1L, 2L), .Label = c("array1", "array2"), class = "factor"), signal = 10:15, flag = structure(c(2L, 1L, 2L, 1L, 2L, 1L ), .Label = c("false", "true"), class = "factor")), .Names c("geneid", "array", "signal", "flag"), row.names = c(NA, -6L), class = "data.frame") B<-structure(list(flag = structure(c(2L, 2L, 1L, 2L, 1L, 1L), .Label c("false", "true"), class = "factor"), geneid = c(3, 1, 2, 2, 3, 1), signal = c(14L, 10L, 13L, 12L, 15L, 11L), array = structure(c(1L, 1L, 2L, 1L, 2L, 2L), .Label = c("array1", "array2"), class = "factor")), .Names c("flag", "geneid", "signal", "array"), row.names = c(5L, 1L, 4L, 3L, 6L, 2L), class = "data.frame") # Son A y B iguales? A<-A[,order(colnames(A))] # ordenando las columnas de A B<-B[order(rownames(B)),order(colnames(B))] # ordenando las filas y columnas de B all.equal(A,B) [1] TRUE Ahora, usemos una función: # A y B son data frames Compare<-function(A,B){ A<-A[,order(colnames(A))] B<-B[order(rownames(B)),order(colnames(B))] all.equal(A,B) } Compare(A,B) [1] TRUE Espero sea de utilidad, --JIV Jorge Ivan Velez jorgeivanvelez+at+gmail+dot+com 2009/3/25 Usuario R <r.user.spain@gmail.com>> Hola, > > Estoy tratando de comparar dos data frames que son iguales si tienen las > mismas filas, pero están desordenados tanto por filas como por columnas. > Además no tienen ninguna columna con valores únicos por lo que no puedo > ordenar en función de ninguna columna. he visto no obstante que la > combinación de dos columnas si tiene valores únicos, por lo que para la > comparación hice esto: > > Valores originales: > > > x > geneid array signal flag > 1 1 array1 10 true > 2 1 array2 11 false > 3 2 array1 12 true > 4 2 array2 13 false > 5 3 array1 14 true > 6 3 array2 15 false > > y > flag geneid signal array > 1 true 3 14 array1 > 2 true 1 10 array1 > 3 false 2 13 array2 > 4 true 2 12 array1 > 5 false 3 15 array2 > 6 false 1 11 array2 > > > Primero ordeno las columnas: > > x <- x[ , sort( colnames( x ) ) ] > y <- y[ , sort( colnames( y ) ) ] > > Luego ordeno la combinación de las columnas que forman valores únicos: > > kk <- cbind( y, "orden" = paste( y[ , "geneid" ], y[ , "array" ], sep > "" ) ) > ordenado <- y[ order( kk$orden ) , ] > > Los objetos ordenado y x son exactamente iguales pero al hacer esto: > > library( RUnit ) > checkEquals( ordenado, x ) > > > Obtengo que son diferentes, ¿Alguien sabe porqué? Es lo que yo siempre > utilizo para ver si dos objetos grandes son o no iguales, pero en este caso > parece no funcionar... > > Gracias, un saludo > > [[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, Muchas gracias, vuestras respuestas me han sido de mucha utilidad. Un saludo El 26 de marzo de 2009 16:44, Jorge Ivan Velez <jorgeivanvelez@gmail.com>escribió:> > Buenos dias, > En mi respuesta de ayer cometí un error (gracias a Olivier Nuñez por > hacerme notarlo). > > El problema está, más que en el nombre de las filas, en su orden. Esta > nueva versión permite comparar ambos data frames (x y ordenado, ahora > llamados A y B, respectivamente): > > # Datos originales > A<-structure(list(geneid = c(1, 1, 2, 2, 3, 3), array = structure(c(1L, > 2L, 1L, 2L, 1L, 2L), .Label = c("array1", "array2"), class = "factor"), > signal = 10:15, flag = structure(c(2L, 1L, 2L, 1L, 2L, 1L > ), .Label = c("false", "true"), class = "factor")), .Names > c("geneid", > "array", "signal", "flag"), row.names = c(NA, -6L), class = "data.frame") > > B<-structure(list(flag = structure(c(2L, 2L, 1L, 2L, 1L, 1L), .Label > c("false", > "true"), class = "factor"), geneid = c(3, 1, 2, 2, 3, 1), signal = c(14L, > 10L, 13L, 12L, 15L, 11L), array = structure(c(1L, 1L, 2L, 1L, > 2L, 2L), .Label = c("array1", "array2"), class = "factor")), .Names > c("flag", > "geneid", "signal", "array"), row.names = c(5L, 1L, 4L, 3L, 6L, > 2L), class = "data.frame") > > # Son A y B iguales? > A<-A[,order(colnames(A))] # ordenando las > columnas de A > B<-B[order(rownames(B)),order(colnames(B))] # ordenando las filas y > columnas de B > all.equal(A,B) > [1] TRUE > > Ahora, usemos una función: > > # A y B son data frames > Compare<-function(A,B){ > A<-A[,order(colnames(A))] > B<-B[order(rownames(B)),order(colnames(B))] > all.equal(A,B) > } > > Compare(A,B) > [1] TRUE > > > Espero sea de utilidad, > > --JIV > > Jorge Ivan Velez > jorgeivanvelez+at+gmail+dot+com > > > 2009/3/25 Usuario R <r.user.spain@gmail.com> > >> Hola, >> >> >> Estoy tratando de comparar dos data frames que son iguales si tienen las >> mismas filas, pero están desordenados tanto por filas como por columnas. >> Además no tienen ninguna columna con valores únicos por lo que no puedo >> ordenar en función de ninguna columna. he visto no obstante que la >> combinación de dos columnas si tiene valores únicos, por lo que para la >> comparación hice esto: >> >> Valores originales: >> >> > x >> geneid array signal flag >> 1 1 array1 10 true >> 2 1 array2 11 false >> 3 2 array1 12 true >> 4 2 array2 13 false >> 5 3 array1 14 true >> 6 3 array2 15 false >> > y >> flag geneid signal array >> 1 true 3 14 array1 >> 2 true 1 10 array1 >> 3 false 2 13 array2 >> 4 true 2 12 array1 >> 5 false 3 15 array2 >> 6 false 1 11 array2 >> >> >> Primero ordeno las columnas: >> >> x <- x[ , sort( colnames( x ) ) ] >> y <- y[ , sort( colnames( y ) ) ] >> >> Luego ordeno la combinación de las columnas que forman valores únicos: >> >> kk <- cbind( y, "orden" = paste( y[ , "geneid" ], y[ , "array" ], sep >> >> "" ) ) >> ordenado <- y[ order( kk$orden ) , ] >> >> Los objetos ordenado y x son exactamente iguales pero al hacer esto: >> >> library( RUnit ) >> checkEquals( ordenado, x ) >> >> >> Obtengo que son diferentes, ¿Alguien sabe porqué? Es lo que yo siempre >> utilizo para ver si dos objetos grandes son o no iguales, pero en este >> caso >> parece no funcionar... >> >> Gracias, un saludo >> >> [[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]]