сопоставить несколько наборов данных с предопределенными значениями, начинающимися с

#r

#r

Вопрос:

 DF<-data.frame(id=c(1,2,3,4,5,6),date=c("2001-01-01","NA","2005-05-05","2006-06-06","2007-07-07","NA"))

  id       date
1  1 2001-01-01
2  2         NA
3  3 2005-05-05
4  4 2006-06-06
5  5 2007-07-07
6  6         NA

DF1<-data.frame(id=c(1,3,7,8,9,11),cdate=c("2000-12-20","2002-02-02","2003-03-03","2004-04-04","2005-05-05","2006-06-06"),atc=c("AAA1","BBB","AAA","DDD","CCC","AAA"))

  id      cdate atc
1  1 2000-12-20 AAA1
2  3 2002-02-02 BBB
3  7 2003-03-03 AAA
4  8 2004-04-04 DDD
5  9 2005-05-05 CCC
6 11 2006-06-06 AAA

 DF2<-data.frame(id=c(1,2,3,4,8,9),cdate=c("2000-12-20","2002-02-02","2005-04-05","2004-04-04","2005-05-05","2006-06-06"),op=c("AA3","BB","AA","DD","CC","AA"))

  id      cdate op
1  1 2000-12-20 AA3
2  2 2002-02-02 BB
3  3 2005-04-05 AA
4  4 2004-04-04 DD
5  8 2005-05-05 CC
6  9 2006-06-06 AA

LM<-c("AAA","AA","BB")
  

Теперь я хочу проверить, содержат ли DF1 и DF2 какой-либо идентификатор в DF, где atc / op начинаются со значений в LM. Наконец, cdate не должен быть более чем на 90 старше даты.

Желаемый результат:

   id opatc
1  1     1
2  2     0
3  3     1
4  4     0
5  5     0
6  6     0
  

Какой самый разумный способ (кратчайший код) решения этой проблемы?
Наилучший H

Комментарии:

1. не должны ли идентификаторы 1 и 3 иметь два результата в желаемом выводе, как в DF1 и DF2

2. Нет, это либо другое

Ответ №1:

используя tidyverse, вы могли бы сделать:

 library(tidyverse)
DF %>%
  left_join(DF1, "id")%>%
  left_join(DF2, "id")%>%
  mutate( cdate.x = as.Date(cdate.x),cdate.y = as.Date(cdate.y),
          date = as.Date(date),
          opatc = date - pmax(coalesce(cdate.x,cdate.y), cdate.y) <= 90) %>%
  group_by(id)%>%
  mutate(opatc =  (opatcamp;invoke("|",across(c(atc, op),
                                ~any(sub("\d $","",.x)%in%LM)))))%>%
  replace_na(list(opatc = 0))%>%
  select(id, opatc)

# A tibble: 6 x 2
# Groups:   id [6]
     id opatc
  <dbl> <dbl>
1     1     1
2     2     0
3     3     1
4     4     0
5     5     0
6     6     0

         
  

Комментарии:

1. Большое спасибо Onyambu! Несколько функций, на которые мне нужно взглянуть поближе. Отлично