正则表达式以获取包含data.table中的值的所有行?

时间:2017-02-02 04:09:07

标签: r regex data.table

我想检查具有给定类别的所有日期的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,因为它不包含我需要的所有日期。

1 个答案:

答案 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