Объединение двух фреймов данных в R, которые имеют общие и необычные выборки - PullRequest
6 голосов
/ 15 февраля 2012

У меня есть два фрейма данных, Data1 и Data2, которые я хочу объединить на основе переменной «ID».

Данные этого примера можно скачать здесь: http://dl.dropbox.com/u/52600559/example.RData

Вот первый кадр данных:

> 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

А вот второй кадр данных:

> 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

Я пытался объединить их так:

> 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

Как видите, оба фрейма данных имеют много одинаковых переменных. Однако некоторые идентификаторы в Data1 не находятся в Data2, и наоборот. Кроме того, некоторые идентификаторы расположены в обоих фреймах данных.

Вопрос 1: Я хочу объединить все столбцы, которые показаны выше. Итак, я хочу, чтобы "Fruit.x" был объединен с "Fruit.y". в одну колонку под названием «Фрукты». Как я могу это сделать?

Вопрос 2. Что если для одного из образцов, который, как оказалось, присутствует как в Data1, так и в Data2, одно из значений не совпадает. Таким образом, для идентификатора образца 1, если Fruit.x - это Apple, но Fruit.y неверно закодирован как Aple (с опечаткой), есть ли способ быстро проверить все эти экземпляры, чтобы выбрать правильный? Или я могу сказать R всегда считать Data1 корректным по сравнению с Data2, когда это происходит?

Спасибо всем, кто может помочь !!

Ответы [ 3 ]

11 голосов
/ 15 февраля 2012

Попробуйте это:

merge(Data1, Data2, all = TRUE)

, и для правописания попробуйте это, где amatch - это приблизительные совпадения с fruit, а near содержит приблизительные совпадения, которые не совпадают точно:

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

Использование предоставленных данных дает:

Berry : Cranberry 

РЕДАКТИРОВАТЬ: улучшенная четкость кода

3 голосов
/ 15 февраля 2012

Чтобы ответить на вопрос 1:

merge(data1, data2, all=T)

должно дать вам то, что вы ищете. Это не будет иметь дело с опечатками все же. вам придется иметь дело с ними отдельно. unique - это хороший инструмент для их нахождения как tolower для нормализации проблем с капитализацией.

2 голосов
/ 15 февраля 2012

Это должно помочь вам пройти большую часть пути: он сложит два фрейма данных и отбросит повторяющиеся строки.

unique(rbind(Data1, Data2))

Извините, у меня нет хороших советов, чтобы справляться с ошибками.

...