2012-06-11 28 views
6

Tengo dos marcos de datos con dos columnas (por ejemplo, xey). Necesito comparar los dos marcos de datos y ver si alguno de los valores en x o y o ambos xey son similares en los dos marcos de datos.¿Cómo comparar dos marcos de datos?

+2

Necesitaremos saber qué contiene el marco de datos: enteros, numéricos, factores, ¿algo más? Por ejemplo, un marco de datos de ejemplo realmente simple que contiene datos numéricos aleatorios se puede hacer por 'df1 <- data.frame (x = rnorm (10), y = rnorm (10))' y dos de estos se pueden sustraer directamente siempre que tengan los mismos nombres de columna (pero el orden de sus filas sería crítico para una respuesta correcta). –

Respuesta

27

Utilice all.equal function. No ordena los marcos de datos. Simplemente comprobará cada celda en data frame contra la misma celda en otra. También puede usar la función identical().

2

Sin un ejemplo, no puedo estar seguro de que entiendo lo que quiere. Sin embargo, creo que quieres algo como esto. Si es así, seguramente hay mejores formas de hacer lo mismo.

a <- matrix(c(1,2, 
       3,4, 
       5,6, 
       7,8), nrow=4, byrow=T, dimnames = list(NULL, c("x","y"))) 

b <- matrix(c(1,2, 
       9,4, 
       9,6, 
       7,9), nrow=4, byrow=T, dimnames = list(NULL, c("x","y"))) 

cc <- matrix(c(NA,NA, 
       NA,NA, 
       NA,NA, 
       NA,NA), nrow=4, byrow=T, dimnames = list(NULL, c("x","y"))) 

for(i in 1:dim(a)[1]) { 
for(j in 1:dim(a)[2]) { 
if(a[i,j]==b[i,j]) cc[i,j]=a[i,j] 
} 
} 

cc 

EDITAR: 8 Enero 2,013 mil

La siguiente línea le dirá que las células difieren entre las dos matrices:

which(a != b, arr.ind=TRUE) 

#  row col 
# [1,] 2 1 
# [2,] 3 1 
# [3,] 4 2 

Si las dos matrices, a y b, son idénticos entonces :

which(a != b) 

# integer(0) 

which(a != b, arr.ind=TRUE) 

# row col 

EDITAR 9 de enero de, 2012

El siguiente código muestra el efecto que los nombres de fila pueden tener en identical, all.equal y which cuando se crea uno de los dos marcos de datos mediante el subconjunto de un tercer marco de datos. Si los nombres de fila difieren entre las dos tramas de datos que se comparan, entonces ni identical ni all.equal devolverán TRUE. Sin embargo, which se puede usar para comparar las columnas x y y entre los dos marcos de datos. Si los nombres de fila están configurados en NULL para cada una de las dos tramas de datos que se comparan, tanto identical como all.equal devolverán TRUE.

df1 <- read.table(text = " 
    group x y 
     1 10 20 
     1 10 20 
     1 10 20 
     1 10 20 
     2 1 2 
     2 3 4 
     2 5 6 
     2 7 8 
", sep = "", header = TRUE) 

df2 <- read.table(text = " 
    group x y 
     2 1 2 
     2 3 4 
     2 5 6 
     2 7 8 
", sep = "", header = TRUE) 

# df3 is a subset of df1 

df3 <- df1[df1$group==2,] 

# rownames differ between df2 and df3 and 
# therefore neither 'all.equal' nor 'identical' return TRUE 
# even though the i,j cells of df2 and df3 are the same. 
# Note that 'which' indicates no i,j cells differ between df2 and df3 

df2 
df3 

all.equal(df2, df3) 
identical(df2, df3) 
which(df2 != df3) 

# set row names to NULL in both data sets and 
# now both 'all.equal' and 'identical' return TRUE. 
# Note that 'which' still indicates no i,j cells differ between df2 and df3 

rownames(df2) <- NULL 
rownames(df3) <- NULL 

df2 
df3 

all.equal(df2, df3) 
identical(df2, df3) 
which(df2 != df3)