搜索文本并将结果存储在数据框中的新列中
Posted
技术标签:
【中文标题】搜索文本并将结果存储在数据框中的新列中【英文标题】:searching for texting and storing results in new columns within the dataframe 【发布时间】:2022-01-16 13:40:11 【问题描述】:我有一个包含一列的数据框 (df1),每个条目/行/观察由一长串文本 (df1$text) 组成。在一个单独的数据框 (df2) 中,我有一列,每个条目/行/观察由一个名称 (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 中都有很多观察结果。
【问题讨论】:
【参考方案1】:使用lapply
的基本 R 选项 -
df1[df2$name] <- lapply(df2$name, function(x) +(grepl(x, df1$text)))
如果您希望匹配不区分大小写,请在grepl
中添加ignore.case = TRUE
。
【讨论】:
谢谢,效果很好!【参考方案2】:我不确定您是否提供了可重现的示例。所以,我自己做了虚拟数据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
【讨论】:
谢谢!唯一的问题是我在 df2 中有 70 多个名字,所以希望能自动化这个过程。以上是关于搜索文本并将结果存储在数据框中的新列中的主要内容,如果未能解决你的问题,请参考以下文章