【发布时间】:2014-02-04 02:05:20
【问题描述】:
抱歉,问题太长了。我会尽我最大的努力清楚地阐明我的目标
我想用update方法在data.table中添加假人,和this already answered in this link一样,但是稍微复杂一点。
为了更好地描述,我创建了数据。
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是一个data.table,包含UID、日期和值的信息。在原始数据中,结构相同,但时间跨度较长(2年)。
这里我想根据日期添加假人。
日期有几个特殊的时间跨度,我们可以用假期来表示。
例如,在我上面创建的假数据中。
有两个假期
- 从“2012-01-02”到“2012-01-05”
- 从“2012-02-02”到“2012-02-03”
我要添加两种类型的假人
- 关于假期长度的傻瓜:首先计算不同假期的长度。在此示例中,我们有两个不同的长度(2 和 4)。因此,我们将添加 2 个假人来指示日期是否在这些假期中。
预期的结果是这样的:
UID 日期值 D_length_2 D_length_4 UID1 2012 年 1 月 1 日 1 假 假 UID2 2012 年 1 月 2 日 2 假 真 UID3 2012 年 1 月 3 日 3 假 真 UID4 2012 年 1 月 4 日 4 假 真 UID5 2012 年 1 月 5 日 5 假 真 UID1 2012 年 1 月 6 日 6 假 假 UID2 2/1/2012 7 真假 UID3 2/2/2012 8 真假 UID4 2/3/2012 9 假 假 UID5 2/4/2012 10 假 假- 关于这一天是正好是假期前一天还是正好是假期后一天的傻瓜。
所以总的期望结果是这样的
UID Date Val 之前 之后 D_length_2 D_length_4 UID1 1/1/2012 1 真假假假 UID2 2012 年 1 月 2 日 2 FALSE FALSE FALSE TRUE UID3 2012 年 1 月 3 日 3 FALSE FALSE FALSE TRUE UID4 1/4/2012 4 FALSE FALSE FALSE TRUE UID5 2012 年 1 月 5 日 5 FALSE FALSE FALSE TRUE UID1 1/6/2012 6 FALSE TRUE FALSE FALSE UID2 2/1/2012 7 真假假假 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中的更新,任何关于如何处理它以及如何编写更新函数的想法都非常欢迎!
【问题讨论】:
标签: r data.table