R 如何跨多个列表映射具有多个变量的函数
我对mapply()和do.call有点不了解 我有两个类似的列表:R 如何跨多个列表映射具有多个变量的函数,r,mapply,R,Mapply,我对mapply()和do.call有点不了解 我有两个类似的列表: ID START END a1 1/1/2000 1/30/2000 a2 5/4/2000 3/1/2002 a3 5/8/2004 8/7/2005 a4 1/3/2012 5/7/2015 ID START END b1 5/
ID START END
a1 1/1/2000 1/30/2000
a2 5/4/2000 3/1/2002
a3 5/8/2004 8/7/2005
a4 1/3/2012 5/7/2015
ID START END
b1 5/1/2000 1/30/2020
b2 6/4/2007 3/1/2008
b3 5/8/2014 8/7/2015
b4 1/3/1999 5/7/2019
许多日期彼此重叠,这就是我想要确定的。我正在尝试为第一个列表中第二个列表中的每个条目创建一列,说明日期范围是否重叠
ID START END b1 b2 b3 b4
a1 1/1/2000 1/30/2000 0 0 0 1
a2 5/4/2000 3/1/2002 1 0 0 1
a3 5/8/2004 8/7/2005 1 0 0 1
a4 1/3/2012 5/7/2015 1 0 1 1
其中0表示未重叠的事件,1表示重叠
到目前为止,我的工作是在具有多个变量的函数中使用dplyr mutate。然后我尝试使用mapply将整个列表作为这些变量输入
builder <- function(id,start,finish){
resource_const_all <- resource_const %>%
mutate(id = ifelse(start > START & start < END,"1",
ifelse(finish > START & finish < END, "1",
ifelse(start < START & finish > END, "1", "0"))))
}
###if the start date falls in the date range, it returns 1.
###if the end date falls in the date range, it returns 1.
###if the start date is before the date range and the end date is after, it
###returns 1.
###Else the dates don't overlap, returns 0.
builder_output <- mapply(builder,id_list,start_list,end_list))
builder START&STARTSTART&finish结束,“1”,“0”))
}
###如果开始日期在日期范围内,则返回1。
###如果结束日期在日期范围内,则返回1。
###如果开始日期在日期范围之前,结束日期在之后,则
###返回1。
###否则日期不重叠,返回0。
生成器输出假设注释末尾重复显示的数据,我们确保开始
和结束
列为日期
类。然后使用outer
,如图所示
请注意,overlap
是一种通用测试,overlaab
使其特定于a
和B
没有使用任何软件包
overlap <- function(start1, end1, start2, end2) {
(start1 >= start2 & start1 <= end2) | (start2 >= start1 & start2 <= end1)
}
overlapAB <- function(idA, idB) {
i <- match(idA, A$ID)
j <- match(idB, B$ID)
overlap(A$START[i], A$END[i], B$START[j], B$END[j])
}
cbind(A, +outer(A$ID, B$ID, overlapAB))
注
linea目前离我的框很远,但是看看data.table::foverlaps
@PavoDive——这非常有用,我想我会在我当前的脚本中使用它。谢谢
ID START END b1 b2 b3 b4
1 a1 2000-01-01 2000-01-30 0 0 0 1
2 a2 2000-05-04 2002-03-01 1 0 0 1
3 a3 2004-05-08 2005-08-07 1 0 0 1
4 a4 2012-01-03 2015-05-07 1 0 1 1
LinesA <- "ID START END
a1 1/1/2000 1/30/2000
a2 5/4/2000 3/1/2002
a3 5/8/2004 8/7/2005
a4 1/3/2012 5/7/2015"
LinesB <- "ID START END
b1 5/1/2000 1/30/2020
b2 6/4/2007 3/1/2008
b3 5/8/2014 8/7/2015
b4 1/3/1999 5/7/2019"
fmt <- "%m/%d/%Y"
A <- read.table(text = LinesA, header = TRUE, as.is = TRUE)
A$START <- as.Date(A$START, fmt)
A$END <- as.Date(A$END, fmt)
B <- read.table(text = LinesB, header = TRUE, as.is = TRUE)
B$START <- as.Date(B$START, fmt)
B$END <- as.Date(B$END, fmt)