【问题标题】:Regular expression to get all rows containing a value within a data.table?正则表达式获取data.table中包含值的所有行?
【发布时间】: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


【解决方案1】:

这是通过遍历可能的类别创建的一种尝试(向@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

【讨论】:

  • 啊,当然,在sapply 上使用lapply 作为grepl。一个命令就能搞定,真是太棒了!
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
相关资源
最近更新 更多