2012-06-11 44 views
6

Tôi có hai khung dữ liệu có hai cột (ví dụ: x và y). Tôi cần phải so sánh hai dataframes và xem liệu bất kỳ giá trị trong x hoặc y hoặc cả hai x và y là tương tự trong hai dataframes.Làm thế nào để so sánh hai dataframes?

+2

Chúng tôi cần biết khung dữ liệu chứa: số nguyên, số, yếu tố, cái gì khác? Ví dụ một khung dữ liệu ví dụ thực sự đơn giản chứa dữ liệu số ngẫu nhiên có thể được thực hiện bởi 'df1 <- data.frame (x = rnorm (10), y = rnorm (10))' và hai trong số này có thể được trừ trực tiếp miễn là chúng có các tên cột giống nhau (nhưng thứ tự các hàng của bạn sẽ rất quan trọng đối với câu trả lời đúng). –

Trả lời

27

Sử dụng chức năng all.equal. Nó không sắp xếp các khung dữ liệu. Nó sẽ chỉ cần kiểm tra từng ô trong data frame với cùng một ô trong một ô khác. Bạn cũng có thể sử dụng chức năng identical().

2

Không có ví dụ, tôi không thể chắc chắn tôi hiểu những gì bạn muốn. Tuy nhiên, tôi nghĩ bạn muốn một cái gì đó như thế này. Nếu vậy, có những cách tốt hơn gần như chắc chắn để làm điều tương tự.

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 

EDIT: 08 tháng 1 năm 2013

Các dòng sau sẽ cho bạn biết các tế bào khác nhau giữa hai ma trận:

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

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

Nếu hai ma trận, a, b là giống hệt nhau rồi :

which(a != b) 

# integer(0) 

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

# row col 

EDIT ngày 9 tháng 1 năm 2012

Đoạn mã sau minh họa hiệu ứng tên hàng có thể có trên identical, all.equalwhich khi một trong hai khung dữ liệu được tạo bằng cách đặt một khung dữ liệu thứ ba. Nếu tên hàng khác nhau giữa hai khung dữ liệu được so sánh thì không phải identical cũng không phải all.equal sẽ trả lại TRUE. Tuy nhiên, which vẫn có thể được sử dụng để so sánh các cột xy giữa hai khung dữ liệu. Nếu tên hàng được đặt thành NULL cho mỗi khung dữ liệu được so sánh thì cả hai số identicalall.equal sẽ trả về 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) 
Các vấn đề liên quan