如何根据文本分析和事件的时间顺序创建虚拟变量?

How can I create a dummy variable based on text analysis and time sequence of events?

Coworkers Date
A 2011-01-01
D 2011-01-02
B;;D 2011-01-03
E;;F 2011-01-04
D 2012-11-05
D;;G 2012-11-06
A 2012-11-09

您好,我正在尝试创建一个基于文本分析的虚拟变量(例如,grepl)。 分析单位是项目,两个主要变量是同事(文本)和日期。

我很好奇是否有任何方法可以创建一个虚拟变量,将与“B”(在本例中为 D)合作的工人完成的所有项目指示为 1。 我想添加的另一个关键条件是......我只想将 1 的值赋予 B 和 D 一起工作后发生的项目。 我的意思是,在这种情况下,我想将由 D 完成的第二行的项目标记为 0,因为它发生在 B 和 D 相遇之前。

我可以使用 R 命令创建这种类型的变量吗? 由于我有数百万个观察结果,我无法手动完成。 table 中的字母是文本。

谢谢!

PS。在“同事”一栏中,同事之间用;;

分隔

这是 tidyverse 的一种可能解决方案(至少我认为这就是您要寻找的)。首先,我创建一个新列(即 flag),指示 B 是否具有 co-worked 和 D,如果是,则分配一个 1。接下来,我使用 cummax 这将使 B;;D 第一行之后的所有内容都为 1。这为之前和之后创建了两个组。接下来,我使用 case_when 将第一次出现的值更改为 0,如您指定的那样。然后,对于带有 D 的任何行,我更改为 1,所有其他的都更改为 0。

library(tidyverse)

df %>%
  mutate(flag = ifelse(str_detect(Coworkers, "B;;D") | str_detect(Coworkers, "D;;B"), 1, 0),
         flag = cummax(flag == 1),
         flag = case_when(flag != 0 & !duplicated(flag) ~ 0,
                          grepl("D", Coworkers) & flag == 1 ~ 1,
                          TRUE ~ 0))

输出

  Coworkers       Date flag
1         A 2011-01-01    0
2         D 2011-01-02    0
3      B;;D 2011-01-03    0
4      E;;F 2011-01-04    0
5         D 2012-11-05    1
6      D;;G 2012-11-06    1
7         A 2012-11-09    0
8         B 2012-12-09    0
9      C;;B 2012-12-09    0

数据

df <- structure(list(Coworkers = c("A", "D", "B;;D", "E;;F", "D", "D;;G", 
"A", "B", "C;;B"), Date = c("2011-01-01", "2011-01-02", "2011-01-03", 
"2011-01-04", "2012-11-05", "2012-11-06", "2012-11-09", "2012-12-09", 
"2012-12-09")), class = "data.frame", row.names = c(NA, -9L))