2015-09-11 3 views
1

У меня есть два фрейма данных, DFA с датами и id и другие DFB с id и два столбца дат date0, date1. Мне нужна функция для поиска дат в DFA в DFB и создания списка с 1, если дата находится в диапазоне и 0, если нет. После severals испытаний, у меня есть эта функция:r lapply по переменной id

completa_roles <- function(x, y, z) { 
for(i in 1: length(y)){ 
    if ((x >= y[i] & x <= z[i])==TRUE) { 
     m[i] <- 1 
     } else { 
     m[i] <- 0 
     } 
    } 
return(m) 
} 

lapply(x, FUN=completa_roles, y=DFB$date0, z=DFB$date1) 

Эта работа хорошо для одного идентификатора, но я не могу разделить функции по переменной ид, я судил, tapply и dlply. Помощь будет оценена. Пример:

DFA <- data.frame(id= c(3,3,3,3,3,3,5,5,5), x=c("2007-07-01", "2007-08-01", "2007-09-01", 
              "2007-10-01", "2007-11-01", "2007-12-01", 
              "2010-06-01", "2009-06-01", "2008-06-01"), 
       stringsAsFactors = FALSE) 
DFB <- data.frame(id=c(3,3,3,3,5,5), date0=c("2010-01-01", "2008-02-20", "2007-04-02", 
       "2012-09-01", "2000-06-01", "2004-06-01"), date1=c("2015-06-30", "2009-12-31", "2012-08-31", 
       "2015-06-30", "2002-06-01", "2008-06-01"), 
       stringsAsFactors = FALSE) 
DFA$x <- as.Date(DFA$x, origin = "1970-01-01") 
DFB$date0 <- as.Date(DFB$date0, origin = "1970-01-01") 
DFB$date1 <- as.Date(DFB$date1, origin = "1970-01-01") 

m <- list() 
completa_roles <- function(x, y, z) { 
for(i in 1: length(y)){ 
if ((x >= y[i] & x <= z[i])==TRUE) { 
    m[i] <- 1 
} else { 
    m[i] <- 0 
} 
} 
return(m) 
} 

x <- DFA$x 
res <- lapply(x, FUN=completa_roles, y= DFB$date0, z= DFB$date1) 
+1

Просьба рассмотреть возможность воспроизведения воспроизводимого примера. – akrun

+0

Спасибо, я добавляю пример. – AngeG

ответ

1

Если я правильно понимаю, что вы хотите, возможно синтаксически уборщик способ сделать это с dplyr и lubridate библиотек. Вы просто хотите сделать соединение и проверить, что x находится в пределах интервала:

library(dplyr) 
library(lubridate) 

DFA %>% 
    left_join(DFB) %>% 
    mutate(in_range = x %within% interval(date0, date1), 
     in_range = as.numeric(in_range)) 
+0

То, что мне нужно! Спасибо, я никогда не работал с этими пакетами раньше – AngeG