2011-09-05 41 views
5

Tôi đã tạo một tập dữ liệu sử dụng WHO ATC/DDD Index một vài tháng trước và tôi muốn đảm bảo cơ sở dữ liệu trực tuyến vẫn không thay đổi ngày hôm nay, vì vậy tôi đã tải xuống lại và thử sử dụng gói digest trong R để so sánh.sử dụng hàm băm để xác định xem 2 datafram giống hệt nhau (PHẦN 01)

Hai tập dữ liệu (ở định dạng txt) có thể được tải xuống here. (Tôi biết rằng bạn có thể cho rằng tệp không an toàn và có thể có vi-rút, nhưng tôi không biết cách tạo tập dữ liệu giả để sao chép vấn đề tôi có bây giờ, vì vậy tôi tải lên tập dữ liệu cuối cùng)

And I đã viết một kịch bản ít nhất là dưới đây:

library(digest) 

ddd.old <- read.table("ddd.table.old.txt",header=TRUE,stringsAsFactors=FALSE) 
ddd.new <- read.table("ddd.table.new.txt",header=TRUE,stringsAsFactors=FALSE) 


ddd.old[,"ddd"] <- as.character(ddd.old[,"ddd"]) 
ddd.new[,"ddd"] <- as.character(ddd.new[,"ddd"]) 

ddd.old <- data.frame(ddd.old, hash = apply(ddd.old, 1, digest),stringsAsFactors=FALSE) 
ddd.new <- data.frame(ddd.new, hash = apply(ddd.new, 1, digest),stringsAsFactors=FALSE) 

ddd.old <- ddd.old[order(ddd.old[,"hash"]),] 
ddd.new <- ddd.new[order(ddd.new[,"hash"]),] 

và một cái gì đó thực sự thú vị xảy ra khi tôi làm việc kiểm tra:

> table(ddd.old[,"hash"]%in%ddd.new[,"hash"]) #line01 

TRUE 
506 
> table(ddd.new[,"hash"]%in%ddd.old[,"hash"]) #line02 

TRUE 
506 
> digest(ddd.old[,"hash"])==digest(ddd.new[,"hash"]) #line03 
[1] TRUE 
> digest(ddd.old)==digest(ddd.new) #line04 
[1] FALSE 
  • line01line02 cho thấy mỗi hàng i n ddd.old có thể được tìm thấy trong ddd.new và ngược lại.
  • line03 cho thấy rằng cột hash cho cả dataframe đều giống nhau
  • line04 cho thấy rằng hai dataframe là khác nhau

gì xảy ra? Cả hai khung dữ liệu có các hàng giống hệt nhau (từ line01line02), cùng một thứ tự (từ line03), nhưng khác nhau? (từ line04)

Hoặc tôi có bất kỳ sự hiểu lầm nào về digest không? Cảm ơn.

+2

Bạn có thể sử dụng 'all.equal (ddd.old, ddd.new)' để kiểm tra sự khác biệt. – Marek

Trả lời

4

Đọc dữ liệu như trước đây.

ddd.old <- read.table("ddd.table.old.txt",header=TRUE,stringsAsFactors=FALSE) 
ddd.new <- read.table("ddd.table.new.txt",header=TRUE,stringsAsFactors=FALSE) 
ddd.old[,"ddd"] <- as.character(ddd.old[,"ddd"]) 
ddd.new[,"ddd"] <- as.character(ddd.new[,"ddd"]) 

Giống như Marek nói, bắt đầu bằng cách kiểm tra sự khác biệt với all.equal.

all.equal(ddd.old, ddd.new) 
[1] "Component 6: 4 string mismatches" 
[2] "Component 8: 24 string mismatches" 

Vì vậy, chúng ta chỉ cần nhìn vào cột 6 và 8.

different.old <- ddd.old[, c(6, 8)] 
different.new <- ddd.new[, c(6, 8)] 

Hash các cột này.

hash.old <- apply(different.old, 1, digest) 
hash.new <- apply(different.new, 1, digest) 

Và tìm các hàng mà chúng không khớp.

different_rows <- which(hash.old != hash.new) #which is optional 

Cuối cùng, kết hợp bộ dữ liệu.

cbind(different.old[different_rows, ], different.new[different_rows, ]) 
Các vấn đề liên quan