r lapply by id 变量

r lapply by id variable

我有两个数据框,带日期和 ID 的 DFA,带 ID 的其他 DFB,以及两列日期 date0、date1。 我想要一个函数来搜索 DFB 中 DFA 中的日期,并创建一个列表,如果日期在范围内,则为 1,如果不在范围内,则为 0。 经过几次试验,我有了这个功能:

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)

这对于一个 id 工作正常,但我不能通过 id 变量拆分函数,我尝试了 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)

如果我正确理解了您的需求,那么使用 dplyrlubridate 库可能是一种语法上更简洁的方法。您只想进行连接并检查 x 是否在区间内:

library(dplyr)
library(lubridate)

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