抱歉问了这么长的问题。我会尽力明确我的目标
我想使用 update 方法在 data.table 中添加虚拟对象,就像这已经在此链接中得到回答 https://stackoverflow.com/questions/18881073/creating-dummy-variables-in-r-data-table,但稍微复杂一点。
为了更好地描述,我创建了数据。
DT <- data.table(UID = paste0("UID",rep(1:5,each=2)),
date = as.IDate(c("2012-01-01","2012-01-02","2012-01-03","2012-01-04","2012-01-05","2012-01-06","2012-02-01","2012-02-02","2012-02-03","2012-02-04")),
value = c(1:10))
DT是一个数据表,包含UID、日期和值的信息。原始数据中,结构完全相同,但时间跨度较长(2年)。
在这里我想根据日期添加虚拟对象。
日期中有几个特殊的时间跨度,我们可以用假期来表示。
例如,在我上面创建的虚假数据中。
还有两个假期
- 从“2012-01-02”到“2012-01-05”
- 从“2012-02-02”到“2012-02-03”
我想添加 2 种类型的假人
- 关于假期长度的虚拟:首先计算不同假期的长度。在此示例中,我们有两个不同的长度(2 和 4)。因此,我们将添加 2 个虚拟变量来指示该日期是否在这些假期中。
预期结果是这样的:
UID Date Val D_length_2 D_length_4
UID1 1/1/2012 1 FALSE FALSE
UID2 1/2/2012 2 FALSE TRUE
UID3 1/3/2012 3 FALSE TRUE
UID4 1/4/2012 4 FALSE TRUE
UID5 1/5/2012 5 FALSE TRUE
UID1 1/6/2012 6 FALSE FALSE
UID2 2/1/2012 7 TRUE FALSE
UID3 2/2/2012 8 TRUE FALSE
UID4 2/3/2012 9 FALSE FALSE
UID5 2/4/2012 10 FALSE FALSE
- 关于这一天是假期前一天还是假期后一天的虚拟信息。
UID Date Val Before After
UID1 1/1/2012 1 TRUE FALSE
UID2 1/2/2012 2 FALSE FALSE
UID3 1/3/2012 3 FALSE FALSE
UID4 1/4/2012 4 FALSE FALSE
UID5 1/5/2012 5 FALSE FALSE
UID1 1/6/2012 6 FALSE TRUE
UID2 2/1/2012 7 TRUE FALSE
UID3 2/2/2012 8 FALSE FALSE
UID4 2/3/2012 9 FALSE FALSE
UID5 2/4/2012 10 FALSE TRUE
所以想要的结果总共是这样的
UID Date Val Before After D_length_2 D_length_4
UID1 1/1/2012 1 TRUE FALSE FALSE FALSE
UID2 1/2/2012 2 FALSE FALSE FALSE TRUE
UID3 1/3/2012 3 FALSE FALSE FALSE TRUE
UID4 1/4/2012 4 FALSE FALSE FALSE TRUE
UID5 1/5/2012 5 FALSE FALSE FALSE TRUE
UID1 1/6/2012 6 FALSE TRUE FALSE FALSE
UID2 2/1/2012 7 TRUE FALSE FALSE FALSE
UID3 2/2/2012 8 FALSE FALSE TRUE FALSE
UID4 2/3/2012 9 FALSE FALSE TRUE FALSE
UID5 2/4/2012 10 FALSE TRUE FALSE FALSE
总观测值超过 10M 行,大约有 10 个不同的假期和 4 个不同的长度。
对于第二种类型的假人,我认为
f <- function(x){
ifelse(x %in% as.Date(c("2012-01-02","2012-02-02")) - 1, return(TRUE), return(FALSE))
}
DT[,Before:= f(date)]
但似乎不正确。
对于第一个问题,我没有想出一个好的解决方案。
这个问题是关于 data.table 中的更新,非常欢迎任何关于如何处理它以及如何编写更新函数的想法!