2012-06-11 4 views
6

Her biri iki sütuna sahip iki adet veri çerçevem ​​var (örneğin x ve y). İki veri çerçevesini karşılaştırmalı ve x veya y'deki veya x ve y'deki değerlerden herhangi birinin iki veri çerçevesinde benzer olup olmadığını görmem gerekiyor.İki veri tabanı nasıl karşılaştırılır?

+2

Veri çerçevesinin neleri içerdiğini bilmemiz gerek: tam sayı, sayısal, faktör, başka bir şey? Örneğin rasgele sayısal verileri içeren bir çok basit bir örnek veri çerçevesi 'df1

cevap

27

all.equal işlevini kullanın. Veri çerçevelerini sıralamaz. Her hücreyi data frame'da aynı hücreye karşı diğerinde kontrol edecektir. identical() işlevini de kullanabilirsiniz.

2

Örnek olmadan, ne istediğinizi anladığımdan emin değilim. Ancak bence böyle bir şey istiyorsun. Eğer öyleyse, aynı şeyi yapmak için neredeyse kesinlikle daha iyi yollar vardır.

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 

DÜZENLEME: 8 Ocak 2013

aşağıdaki satırı hücreleri iki matrisin arasında farklılık hangi söyleyecektir:

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

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

iki matrisler, a ve b, daha sonra aynıysa :

which(a != b) 

# integer(0) 

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

# row col 

DÜZENLEME 9 Ocak 2012

Aşağıdaki kod iki veri çerçevelerinin bir üçüncü veri çerçevesi alt kümesi tarafından oluşturulduğunda, satır adları identical, all.equal ve which üzerindeki tesirini göstermektedir. Satır adları, karşılaştırılan iki veri çerçevesi arasında farklılık gösteriyorsa, ne identical ne de all.equal, TRUE'u döndürecektir. Ancak, which, iki veri çerçevesinin arasındaki sütunları x ve y karşılaştırmak için hala kullanılabilir. satır adları iki her biri bir veri NULL olarak ayarlanmışsa çerçeveleri TRUE döndürür sonra identical ve all.equal iki karşılaştırılan.

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)