我想检查具有给定类别的所有日期的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。如最后两行所示,可能有一个日期包含对单个类别的多个引用。
有没有办法在data.table中执行此操作?如果绝对必要,我可以使用其他包裹。
请注意,我不能只使用dcast
将D1转换为正确的data.table,因为它不包含我需要的所有日期。
答案 0 :(得分:2)
这是通过循环可能的类别(帽子提示到@Frank进行调整)创建的一次尝试:
DF1[
.(seq(min(Date), max(Date) + 1L, by="day")),
on=.(Date),
lapply(sapply(c("A","B","C","D"), grepl, x=Category, USE.NAMES=TRUE, simplify=FALSE),any),
by=.EACHI
]
# Date A B C D
#1: 2010-01-01 TRUE TRUE FALSE FALSE
#2: 2010-01-02 TRUE FALSE TRUE TRUE
#3: 2010-01-03 FALSE FALSE FALSE FALSE
#4: 2010-01-04 FALSE TRUE FALSE TRUE
#5: 2010-01-05 FALSE FALSE FALSE FALSE