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)
如果我正确理解了您的需求,那么使用 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))
我有两个数据框,带日期和 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)
如果我正确理解了您的需求,那么使用 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))