Струнный матч в г - PullRequest
       81

Струнный матч в г

2 голосов
/ 02 ноября 2019

У меня есть два фрейма данных D1 и D2, как упомянуто ниже. Я хочу сравнить D1 и D2, например, "Issues" из D1 с "list_of_issues" из D2

ID = c(1, 2, 3, 4)
Issues = c('CI', 'E,CI', 'H,A', 'CI,E')
Location = c('x', 'y', 'z', 'w')
Customer = c('a', 'b', 'c', 'd')
D1 = data.frame(ID, Issues, Location, Customer)

Root_Cause = c('R1', 'R2', 'R3', 'R4')
List_of_Issues = c('A', 'A,H', 'E,CI', 'CI')  
D2 = data.frame(Root_Cause, List_of_Issues)

, если проблемы совпадаютс основной причиной, то получите Root_cause в D3, сгенерировав столбец Root_Cause, как это в D3

ID = c(1, 2, 3, 4)
Issues = c('CI', 'E,CI', 'H,A', 'CI,E')
Location = c('x', 'y', 'z', 'w')
Customer = c('a', 'b', 'c', 'd')
Root_Cause = c('R4', 'R3', 'R2', 'R3')
D3 = data.frame(ID, Issues, Location, Customer, Root_Cause)

1 Ответ

0 голосов
/ 02 ноября 2019

Вот быстрое исправление с использованием data.table и setkey (из data.table).

library(data.table) 
D1 <- as.data.table(D1)
setkey(D1, 'Issues') 

D2 <- as.data.table(D2) 
setkey(D2, 'List_of_Issues)

> D1
   ID Issues Location Customer
1:  1     CI        x        a
2:  4   CI,E        w        d
3:  2   E,CI        y        b
4:  3    H,A        z        c
> D2
   Root_Cause List_of_Issues
1:         R1              A
2:         R2            A,H
3:         R4           CI,E
4:         R3           E,CI

# Using the key to get the desired output
> D2[D1, ]
   Root_Cause List_of_Issues ID Location Customer
1:       <NA>             CI  1        x        a
2:         R4           CI,E  4        w        d
3:         R3           E,CI  2        y        b
4:       <NA>            H,A  3        z        c

Установка key позволяет быстро сортировать data.table по этому столбцу. Поскольку data.table работает по ссылке, это делает весь процесс действительно быстрым. Последняя строка кода совпадает с записями key из D1 с key из D2 и возвращает Root_Cause для соответствующих key записей в обоих tables.

Его можно отсортировать по ID, чтобы получить желаемый результат:

> D2[D1, ][order(ID)]
   Root_Cause List_of_Issues ID Location Customer
1:       <NA>             CI  1        x        a
2:         R3           E,CI  2        y        b
3:       <NA>            H,A  3        z        c
4:         R4           CI,E  4        w        d

В вашем примере Root_Cause столбец D3 равен c(NA, 'R3', 'R2', 'R3'), что неверно - по умолчанию A,H равноне то же самое, что H,A, поэтому R2 не будет соответствовать. Во-вторых, CI,E соответствует R4 в D2 из ваших данных выборки.

Вы всегда можете удалить столбцы, установив для них значение NULL, например, Customer := NULL, и изменить порядок столбцов, используя setcolorder().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...