创建一个在特定日期出现的存在-不存在矩阵

Create a presence-absence matrix with presence on specific dates

我想创建一个 presence/absence 矩阵,其中 y 轴为日期,x 轴为个人。当某人在特定日期出现时,输出应为 1,而如果不存在,则输出应为 0。 我有一个数据框,其中包含个人姓名以及他们在群组中出现的日期:

ID Start End
Afr 2015-06-29 2016-02-16
Ahe 2016-12-18 2018-02-24
Art 2015-07-01 2020-04-30
...

我总共有超过一千个人和他们的约会对象。

我还有一个 list/dataframe,其中包含从 2015-01-01 到 2021-31-12 的所有日期。

我的输出数据需要如下所示:

Date Afr Ahe Art ...
2015-07-01 1 0 0 ...
2015-07-02 1 0 1 ...
2015-07-03 1 0 1 ...
...

当某个人当时在组中时,输出为 1,否则为 0。 我觉得应该有一个简单的解决方案来创建它,但到目前为止我还没有成功。我遇到的问题之一是日期列表比包含个人的数据框长,例如不可能实现 dcast 函数。

如有任何帮助或建议,我们将不胜感激!也请让我知道我是否应该提供更多 code/background.

非常感谢!

我们可以试试下面的代码

library(data.table)

setDT(df1)
setDT(df2)

na.omit(
  dcast(
    df1[df2, .(Date, ID), on = .(Start < Date, End > Date)][df1, on = .(ID)],
    Date ~ ID,
    fun.aggregate = length
  )
)

这给出了

         Date Afr Ahe Art
1: 2015-07-01   1   0   0
2: 2015-07-02   1   0   1
3: 2015-07-03   1   0   1

数据

> dput(df1)
structure(list(ID = c("Afr", "Ahe", "Art"), Start = structure(c(16615, 
17153, 16617), class = "Date"), End = structure(c(16847, 17586,
18382), class = "Date")), class = "data.frame", row.names = c(NA,
-3L))

> dput(df2)
structure(list(Date = structure(c(16617, 16618, 16619), class = "Date")), class = "data.frame", row.names = c(NA,
-3L))