【发布时间】:2017-02-02 04:09:06
【问题描述】:
我想检查具有给定类别的所有日期的 data.table,并在单独的 data.table 中将所有这些日期设置为 TRUE。我有一个看起来像这样的 data.table:
library(data.table)
DT1 = fread(
'Date Category
2010-01-01 A
2010-01-01 B
2010-01-02 A
2010-01-02 C
2010-01-02 D
2010-01-04 B
2010-01-04 "B OR D"')
DT1[, Date := as.IDate(Date) ]
我正在尝试将值提取到如下所示的数据框中:
DT2 = fread('
Date A B C D
2010-01-01 FALSE FALSE FALSE FALSE
2010-01-02 FALSE FALSE FALSE FALSE
2010-01-03 FALSE FALSE FALSE FALSE
2010-01-04 FALSE FALSE FALSE FALSE
2010-01-05 FALSE FALSE FALSE FALSE')
DT2[, Date := as.IDate(Date) ]
如果给定日期存在特定类别,我想将包含行日期和类别列的单元格设置为 true。我知道这可能会涉及以下内容:
DT2 <- DT2[Date %in% DT1$Date, A := grep(something)]
我希望此调用将 DT2 修改为如下所示:
Date A B C D
2010-01-01 TRUE FALSE FALSE FALSE
2010-01-02 TRUE FALSE FALSE FALSE
2010-01-03 FALSE FALSE FALSE FALSE
2010-01-04 FALSE FALSE FALSE FALSE
2010-01-05 FALSE FALSE FALSE FALSE
现在,我的代码使用any(grep()),这是一个问题,因为它将DT2$A[4] 更改为TRUE,这是我不想要的。我想使用正则表达式,因为我的一些类别单元格引用了多个值。由于最后一个单元格,我对值 B 和值 D 的检查都应将 2010-01-04 中的虚拟变量设置为 true。如最后 2 行所示,可能有一个日期包含对单个类别的多个引用。
有没有办法在 data.table 中做到这一点?如果绝对必要,我可以使用其他软件包。
请注意,我不能只使用dcast 将 D1 转换为正确的 data.table,因为它不包含我需要的所有日期。
【问题讨论】:
-
是不是你需要的日期总是从min(Date)到max(Date)?
-
好问题!日期实际上超过了最大值(日期)。我会编辑我的问题,但我现在知道该怎么做。
-
好的,很好。仅供参考,通常如果您在发布答案后编辑问题,这里的礼仪是编辑答案以说明您的更改(如果您知道如何)或评论通知他们的答案(假设您可以在那里发表评论..我不知道)。无论如何,相关编辑似乎是
max(Date)到max(Date) + 1L。
标签: r regex data.table