创建一个在特定日期出现的存在-不存在矩阵
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))
我想创建一个 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))