Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何跨多个列表映射具有多个变量的函数_R_Mapply - Fatal编程技术网

R 如何跨多个列表映射具有多个变量的函数

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/

我对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/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)