搜索短信并将结果存储在数据框中的新列中
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
。
我有一个包含一列的数据框 (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
-
df1[df2$name] <- lapply(df2$name, function(x) +(grepl(x, df1$text)))
如果您希望匹配不区分大小写,请在 grepl
中添加 ignore.case = TRUE
。