2012-02-15 29 views
6

Tôi có hai khung dữ liệu, Data1 và Data2, mà tôi muốn hợp nhất dựa trên một biến "ID".Hợp nhất hai khung dữ liệu trong R có các mẫu phổ biến và không phổ biến

Ví dụ này dữ liệu có thể được tải về ở đây: http://dl.dropbox.com/u/52600559/example.RData

Dưới đây là khung dữ liệu đầu tiên:

> Data1 
    ID  Fruit Color Weight 
1 1  Apple Red  5 
2 2 Orange Orange  7 
3 3 Banana Yellow  3 
4 4  Pear Green  5 
5 5 Tomato Red  4 
6 6  Berry Blue  4 
7 7 Mandarin Orange  4 
8 8 Pineapple Yellow  9 
9 9 Nectarine Orange  5 
10 10  Beet Red  5 

Và đây là khung dữ liệu thứ hai:

> Data2 
    ID  Fruit Color Weight 
1 1  Apple Red  5 
2 2  Orange Orange  7 
3 3  Banana Yellow  3 
4 4  Pear Green  5 
5 5  Tomato Red  4 
6 11 Pomegranate Red  6 
7 12  Grape Green  4 
8 13 Cranberry Red  4 
9 14  Melon Pink  5 
10 15  Pumpkin Orange  10 

tôi đã cố gắng hợp nhất chúng như sau:

> merge(Data1, Data2, by = "ID", sort = FALSE, all.x = TRUE, all.y = TRUE) 
    ID Fruit.x Color.x Weight.x  Fruit.y Color.y Weight.y 
1 1  Apple  Red  5  Apple  Red  5 
2 2 Orange Orange  7  Orange Orange  7 
3 3 Banana Yellow  3  Banana Yellow  3 
4 4  Pear Green  5  Pear Green  5 
5 5 Tomato  Red  4  Tomato  Red  4 
6 9 Nectarine Orange  5  <NA> <NA>  NA 
7 6  Berry Blue  4  <NA> <NA>  NA 
8 7 Mandarin Orange  4  <NA> <NA>  NA 
9 8 Pineapple Yellow  9  <NA> <NA>  NA 
10 10  Beet  Red  5  <NA> <NA>  NA 
11 14  <NA> <NA>  NA  Melon Pink  5 
12 11  <NA> <NA>  NA Pomegranate  Red  6 
13 12  <NA> <NA>  NA  Grape Green  4 
14 13  <NA> <NA>  NA Cranberry  Red  4 
15 15  <NA> <NA>  NA  Pumpkin Orange  10 

Như bạn thấy, cả hai khung dữ liệu có nhiều biến số giống nhau. Tuy nhiên, một số ID trong Data1 không có trong Data2 và ngược lại. Hơn nữa, một số ID được đặt trong cả hai khung dữ liệu.

Câu hỏi 1: Tôi muốn hợp nhất tất cả các cột được hiển thị ở trên. Vì vậy, tôi muốn "Fruit.x" được hợp nhất với "Fruit.y". thành một cột gọi là "Trái cây". Tôi có thể làm cái này như thế nào?

Câu hỏi 2: Điều gì xảy ra nếu, đối với một trong các mẫu xảy ra trong cả Data1 và Data2, một trong các giá trị không đồng ý. Vì vậy, đối với ID mẫu 1, nếu Fruit.x là Apple, nhưng Fruit.y được mã hóa không chính xác là Aple (với lỗi chính tả), có cách nào để tôi có thể kiểm tra tất cả các trường hợp này một cách nhanh chóng để tôi có thể chọn cái nào đúng không? Hoặc tôi có thể yêu cầu R luôn xem xét Data1 đúng với Data2 khi điều này xảy ra không?

Nhờ bất kỳ ai có thể trợ giúp !!

+0

Cảm ơn mọi người vì câu trả lời của bạn! +1 cho tất cả! – Alexander

Trả lời

10

Hãy thử điều này:

merge(Data1, Data2, all = TRUE) 

và cho cách viết cố gắng này, nơi amatch là các trận đấu xấp xỉ fruitnear chứa các trận đấu gần đúng rằng không phù hợp chính xác:

for(fruit in Data1$Fruit) { 
    amatch <- agrep(fruit, Data2$Fruit, value = TRUE) 
    near <- amatch[amatch != fruit] 
    if (length(near) > 0) cat(fruit, ":", near, "\n") 
} 

Sử dụng dữ liệu được cung cấp điều này cho:

Berry : Cranberry 

CHỈNH SỬA: cải thiện độ rõ ràng của mã

+0

(+1) trình kiểm tra chính tả tuyệt vời! – Justin

2

Điều này sẽ giúp bạn tận dụng tối đa cách đó: nó sẽ xếp chồng hai khung dữ liệu và thả các hàng lặp lại.

unique(rbind(Data1, Data2)) 

Xin lỗi, tôi không có mẹo hay để giải quyết lỗi chính tả.

3

Để trả lời câu hỏi 1:

merge(data1, data2, all=T) 

nên cung cấp cho bạn những gì bạn đang tìm kiếm. Nó sẽ không đối phó với lỗi chính tả mặc dù. bạn sẽ phải đối phó với chúng một cách riêng biệt. unique là một công cụ tốt để tìm kiếm chúng là tolower để bình thường hóa các vấn đề viết hoa.

Các vấn đề liên quan