Код R для левого соединения, работа с датами, которые совпадают, и другие, не совпадающие - PullRequest
0 голосов
/ 10 июля 2020
dfy<-tibble(ttc= c("830592962A","701134213K","620001491E","500542890M","400259766M","800136692H","701229741E"),
            CaseDate1=c("01/04/2019","01/04/2019","02/04/2019","02/04/2019","02/04/2019","02/04/2019","03/04/2019"),
            Theatre=c("RIE_TH_06","RIE_TH_06","RIE_TH_08","RIE_TH_08","RIE_TH_06","RIE_TH_06","RIE_TH_08"))

dss<-tibble(ttc=c("400259766M","800136692H","701229741E","830592962A","701134213K","620001491E","500542890M"),
            D1=c("NA","01/04/2019","NA","01/04/2019","01/04/2019","02/04/2019","NA"),
            D2=c("02/04/2019","NA","NA","NA","NA","NA","02/04/2019"),
            D3=c("NA","NA","04/04/2019","NA","NA","NA","NA"),
            C5=c("APPLE","ORANGE","PINE","MANGO","CHERRY","SUGAR","GREEN"))
  1. Во-первых, я хочу левое соединение файла на основе точных совпадений
dfy(ttc&CaseDate1)

dss(ttc& coalesce(D1,D2,D3))

Во-вторых, если нет точных совпадений, которые я хочу использовать (за день до или через день в dss(ttc& coalesce(D1,D2,D3))

dfy( 701229741E& 03/04/2019) будет вычислено c в dss(701229741E&04/04/201) на следующий день после или за день до

Я использовал следующий код и присоединился только к совпадающим ttc и датам

dfy %>% 
  left_join(dss %>% mutate(x = coalesce(D1, D2, D3)), by = c("ttc", "CaseDate1" = "x")) %>% 
  select(ttc, CaseDate1, Theatre, C5)

1 Ответ

0 голосов
/ 10 июля 2020

Coalesce не работает должным образом, потому что в данных «NA» является строкой, а не отсутствующими данными. Я исправил это с помощью

for (c in c('D1', 'D2', 'D3')) {
  dss[c][dss[c] == 'NA'] = NA
}

Теперь ваш тот же код возвращает

# A tibble: 7 x 4
  ttc        CaseDate1  Theatre   C5    
  <chr>      <chr>      <chr>     <chr> 
1 830592962A 01/04/2019 RIE_TH_06 MANGO 
2 701134213K 01/04/2019 RIE_TH_06 CHERRY
3 620001491E 02/04/2019 RIE_TH_08 SUGAR 
4 500542890M 02/04/2019 RIE_TH_08 GREEN 
5 400259766M 02/04/2019 RIE_TH_06 APPLE 
6 800136692H 02/04/2019 RIE_TH_06 NA    
7 701229741E 03/04/2019 RIE_TH_08 NA   

Для отсутствующей даты я предлагаю использовать full_join вместо left_join и использовать fill функция в сгруппированном фрейме данных:

dfy %>% 
  full_join(dss %>% mutate(x = coalesce(D1, D2, D3)), by = c("ttc", "CaseDate1" = "x")) %>% 
  select(ttc, CaseDate1, Theatre, C5) %>%
  group_by(ttc) %>%
  arrange(desc(CaseDate1)) %>%
  fill(C5) %>%
  filter(!is.na(Theatre)) %>%
  ungroup() %>%
  arrange(CaseDate1)

выводит

# A tibble: 7 x 4
  ttc        CaseDate1  Theatre   C5    
  <chr>      <chr>      <chr>     <chr> 
1 830592962A 01/04/2019 RIE_TH_06 MANGO 
2 701134213K 01/04/2019 RIE_TH_06 CHERRY
3 620001491E 02/04/2019 RIE_TH_08 SUGAR 
4 500542890M 02/04/2019 RIE_TH_08 GREEN 
5 400259766M 02/04/2019 RIE_TH_06 APPLE 
6 800136692H 02/04/2019 RIE_TH_06 NA    
7 701229741E 03/04/2019 RIE_TH_08 PINE  

filter(!is.na(Theatre)) здесь отбрасывает все, что не было в dfy («левом» фрейме данных).

Если вы хотите заполнить в обоих направлениях, вы можете добавить аргумент .direction к функции fill.

dfy %>% 
  full_join(dss %>% mutate(x = coalesce(D1, D2, D3)), by = c("ttc", "CaseDate1" = "x")) %>% 
  select(ttc, CaseDate1, Theatre, C5) %>%
  group_by(ttc) %>%
  arrange(desc(CaseDate1)) %>%
  fill(C5, .direction='updown') %>%
  filter(!is.na(Theatre)) %>%
  ungroup() %>%
  arrange(CaseDate1)

и вывести

# A tibble: 7 x 4
  ttc        CaseDate1  Theatre   C5    
  <chr>      <chr>      <chr>     <chr> 
1 830592962A 01/04/2019 RIE_TH_06 MANGO 
2 701134213K 01/04/2019 RIE_TH_06 CHERRY
3 620001491E 02/04/2019 RIE_TH_08 SUGAR 
4 500542890M 02/04/2019 RIE_TH_08 GREEN 
5 400259766M 02/04/2019 RIE_TH_06 APPLE 
6 800136692H 02/04/2019 RIE_TH_06 ORANGE
7 701229741E 03/04/2019 RIE_TH_08 PINE  

Мне неясно, является ли это вашим намеченным результатом, но я надеюсь, что он поможет вам в правильном направлении.

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