2012-02-15 21 views
6

Mam dwie ramki danych, Data1 i Data2, które chcę scalić na podstawie zmiennej "ID".Scalanie dwóch ramek danych w R, które mają wspólne i niepospolite próbki

tym przykładzie danych można pobrać tutaj: http://dl.dropbox.com/u/52600559/example.RData

Oto pierwsza ramka danych:

> 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 

A oto druga ramka danych:

> 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 

Próbowałem scal je w następujący sposób:

> 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 

Jak widać, obie ramki danych mają wiele takich samych zmiennych. Jednak niektóre identyfikatory w Data1 nie znajdują się w Data2 i odwrotnie. Ponadto niektóre identyfikatory znajdują się w obu ramkach danych.

Pytanie 1: Chcę również scalić wszystkie kolumny pokazane powyżej. Dlatego chcę połączyć "Fruit.x" z "Fruit.y". w jedną kolumnę o nazwie "Owoce". Jak mogę to zrobić?

Pytanie 2: Co jeśli w przypadku jednej z próbek, które występują zarówno w Data1, jak i Data2, jedna z wartości nie zgadza się. Tak więc dla próbki ID 1, jeśli Fruit.x jest Apple, ale Fruit.y jest nieprawidłowo zakodowany jako Aple (z błędną pisownią), czy istnieje sposób, aby szybko sprawdzić wszystkie te wystąpienia, aby móc wybrać, który z nich jest prawidłowy? Czy mogę powiedzieć R, aby zawsze uważać Data1 za poprawną w porównaniu z Data2, gdy tak się dzieje?

Dziękuję każdemu, kto może pomóc!

+0

Dziękuję wszystkim za odpowiedzi! +1 do wszystkich! – Alexander

Odpowiedz

10

Spróbuj tego:

merge(Data1, Data2, all = TRUE) 

i pisowni spróbować gdzie amatch są przybliżone dopasowania do fruit i near zawiera przybliżone wyniki, które nie pasują dokładnie:

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

Korzystanie z danych dostarczonych to daje:

Berry : Cranberry 

EDYCJA: poprawiona wyrazistość kodu

+0

(+1) ładne sprawdzanie pisowni! – Justin

2

To powinno ci w tym pomóc: oprze dwie ramki danych i upuści powtarzające się wiersze.

unique(rbind(Data1, Data2)) 

Niestety, nie mam dobrych wskazówek, jak radzić sobie z błędami pisowni.

3

Aby odpowiedzieć na pytanie 1:

merge(data1, data2, all=T) 

powinno dać to, czego szukasz. Nie zajmie się jednak błędami pisowni. musiałbyś poradzić sobie z nimi osobno. unique jest dobrym narzędziem do znajdowania ich tak, jak jest tolower w celu normalizacji problemów z dużymi literami.

Powiązane problemy