如何根据文本分析和事件的时间顺序创建虚拟变量?
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))
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))