搜索短信并将结果存储在数据框中的新列中

searching for texting and storing results in new columns within the dataframe

我有一个包含一列的数据框 (df1),每个 entry/row/observation 由一长串文本 (df1$text) 组成。在一个单独的数据框 (df2) 中,我有一列,每一列 entry/row/observation 由一个名称 (df2$name) 组成。

我想为 df1 中的每一行记录 df2$name 中的哪些名称出现在文本中。理想情况下,我想存储名称是否出现在 df1$text 中作为 1/0 值存储在 df1 中的新列(即虚拟变量)中,该列以该名称命名:

> df1
  text
1 ...
2 ...
3 ...
4 ...

> df2
   name
1  John
2  James
3  Jerry
4  Jackson

代码执行后:

> df1
  text John James Jerry Jackson 
1 ...   1    1     0        1
2 ...   0    0     0        1 
3 ...   1    1     0        1
4 ...   1    0     0        1

有没有不用 for 循环的方法?我的文本字段很长,我在 df1 和 df2 中都有很多观察结果。

我不确定您是否提供了可重现的示例。所以,我自己制作了虚拟数据 df1

df1 <- data.frame(
  text = c("John James John Jakson",
           "Jackson abcd zxcv",
           "John Jackson James Jerr aa",
           "John Jackson JAJAJAJA")
)

                        text
1     John James John Jakson
2          Jackson abcd zxcv
3 John Jackson James Jerr aa
4      John Jackson JAJAJAJA

那么,你可以尝试使用dplyr like

library(dplyr)

df1 %>%
  mutate(John = as.numeric(grepl("John", text)),
         James = as.numeric(grepl("James", text)),
         Jerry = as.numeric(grepl("Jerry", text)),
         Jackson = as.numeric(grepl("Jackson", text))
         )

                        text John James Jerry Jackson
1     John James John Jakson    1     1     0       0
2          Jackson abcd zxcv    0     0     0       1
3 John Jackson James Jerr aa    1     1     0       1
4      John Jackson JAJAJAJA    1     0     0       1

使用 lapply -

的基础 R 选项
df1[df2$name] <- lapply(df2$name, function(x) +(grepl(x, df1$text)))

如果您希望匹配不区分大小写,请在 grepl 中添加 ignore.case = TRUE