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

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

那你可以试试dplyrlike

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 多个名字,所以希望能自动化这个过程。

以上是关于搜索文本并将结果存储在数据框中的新列中的主要内容,如果未能解决你的问题,请参考以下文章

Pandas将groupby操作的结果保存为原始数据框中的新列[关闭]

熊猫从数据框中的一列中提取部分字符串并将其存储在一个新列中

将列中的所有值复制到熊猫数据框中的新列

向数据框中的新列添加值

将函数应用于两列并将输出映射到新列[重复]

将数据框中的值列表附加到新列[重复]