[英]How to mapply a function with multiple variables across multiple lists
I'm a little out of my depth with mapply() and do.call... 我对mapply()有点不了解了,然后打电话。
So I have two lists like so: 所以我有两个清单,像这样:
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
Many of the dates overlap with each other, and that's what I'm trying to identify. 许多日期相互重叠,这就是我要确定的。 I'm trying to create a column for each entry on the second list onto the first that says whether or not the date ranges overlap... 我正在尝试为第二个列表上的每个条目创建一个列,以说明日期范围是否重叠...
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
where a 0 represents un-overlapping events, and 1 represents overlap. 其中0表示不重叠的事件,而1表示重叠。
My effort so far has been to use dplyr mutate in a function with multiple variables. 到目前为止,我的工作一直是在具有多个变量的函数中使用dplyr mutate。 Then I'm trying to use mapply to feed the whole lists in as those variables... 然后我试图使用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))
Thanks for any help! 谢谢你的帮助!
Assume the data shown reproducibly in the Note at the end where we ensure that the START
and END
columns are of Date
class. 假设在结尾处的注释中可重复显示的数据,我们确保START
和END
列为Date
类。 Then use outer
as shown. 然后如图所示使用outer
。
Note that overlap
is a generic test and overlapAB
makes it specific to A
and B
. 请注意, overlap
是通用测试, overlapAB
使其特定于A
和B
No packages are used. 不使用任何软件包。
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))
giving: 赠送:
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.