#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! Несколько функций, на которые мне нужно взглянуть поближе. Отлично