Найти значения совпадений в R по двум условиям, одно из которых является датой во временном диапазоне - PullRequest
0 голосов
/ 09 января 2020

У меня есть два разных фрейма данных («Рождение», «Тест»). у них обоих есть столбец идентификационных номеров ("mid.b", "mid.t") с некоторыми из идентификаторов, появляющихся в обоих фреймах данных (даже несколько раз), и никаких других общих данных. У них обоих также есть столбец со значением даты. В каждом фрейме данных идентификатор может появляться несколько раз, но каждая комбинация идентификатора и даты уникальна.

Я хотел бы получить значение из столбца "res.num" в фрейм данных «Test» с соответствующим ему значением m.event из «рождения» DF - если идентификатор в «mid.t» совпадает с идентификатором в «mid.b», и если дата в «Test» "не более чем за 7 месяцев до даты в" Рождении "этого идентификатора.

теперь у меня есть функция, которая вычисляет разрыв в месяце:

пример для фреймов данных:

mid.t<-c(628941,628979,64976)
res.num<-c("A59646","A60921","A61903")
date.t<-c("2016.12.11","2017.10.16","2018.06.13")
test<-cbind.data.frame(mid.t,res.num,date.t)

mid.b<-c(628941,628979,64976)
m.event<-c(21219464,22457757,23365285)
date.b<-c("2017.01.26","2018.02.12","2020.11.13")
birth<-cbind.data.frame(mid.b,m.event,date.b)

на данный момент у меня есть функция, которая вычисляет разрыв в дате в месяце:

mon_ymd<-function(x,y){
gap<-(as.yearmon(strptime(x, format = "%Y.%m.%d"))-as.yearmon(strptime(y, format="%Y.%m.%d")))*12
  return(gap)}

и очень хороший код, который не работает полностью: я получаю: Ошибка в случае, если (idb == idt) {: пропущенное значение, где требуется ИСТИНА / ЛОЖЬ

for (idt in test$mid.t){
  for (idb in birth$mid.b){
    x<-birth[birth$mid.b==idb,]$date.b
    y<-test[test$mid.t==idt,]$date.t
    if (idb==idt){
    gapmon<-mon_ymd(x,y)
      if ((gapmon<=7)&(gapmon>=0)){
        print(test[test$mid.t==idt,]$res.num)
}}}}

1 Ответ

0 голосов
/ 23 января 2020

Я не совсем уверен, что это то, что вам нужно, но это то, что мне удалось перевести из вашего вопроса: Сопоставьте два кадра данных, а затем получите строку, где месячный разрыв между ними равен 7 или больше

library("dplyr")
library("zoo")

filter(
     left_join(birth, test, by = c("mid.b" = "mid.t")) %>% 
     mutate(date.t = as.yearmon(strptime(date.t, format = "%Y.%m.%d")),
            date.b = as.yearmon(strptime(date.b, format = "%Y.%m.%d")), 
            gap = ifelse((date.t - date.b) * 12 <= -7, TRUE, FALSE)
       ), gap == TRUE)


#   mid.b  m.event    date.b res.num    date.t   gap
#1  64976 23365285 nov. 2020  A61903 jun. 2018  TRUE
...