当前位置: 首页 > 知识库问答 >
问题:

搜索跨多个数据帧包含的特定文本,并在新列中返回这些值(出现多次)

晏永康
2023-03-14

寻求帮助,从一个数据帧中搜索多个特定单词,在另一个数据帧的列(正文)中搜索,然后将这些值提取到新的列中。

进一步解释:

    < li >首先,我有一个数据框架,其中包含14个国家的大量文本摘要。 < li >其次,我有第二个数据框架,其中包含所有行政级别(lvl_2)名称,如省、村等。 < li >我想从大型摘要中提取所有提及adm2省/村名称的内容,并为每个单词创建一个新列,旋转更长时间。

这里有一些示例数据,您可以使用它们来重新创建我的问题,其中包含两个数据框:(1)test_admin用于我要搜索的管理级别列表,以及(2)test_dataset$摘要,这是我要运行搜索的列。(您可以忽略Other_Variables的值,这些值在真实数据集中填充了大量值)

test_admin <- data.frame(adm1_name = c("Sindh"),
                   adm2_name = c("Central Karachi", "Dadu", "East Karachi", "Ghotki", "Sujawal", "Sukkur"))
                   
test_dataset <- data.frame(Summary = c("In Cox's Bazar, this and that happened.",
                                       "In Yangon, something else happened",
                                       "In Central Karachi, this happened",
                                       "In Sindh, this happened",
                                       "In Dadu AND East Karachi, this happened"),
                           Other_Variable_1 = 1:5,
                           Other_Variable_2 = 1:5)

更复杂的是,我还希望能够从test_admin数据框的两列中搜索值。例如,如果您的值“Sindh”来自adm1_level列,那么也返回adm2_level下的所有结果将非常酷。

但如果你能在更基本的层次上解决它(只搜索一列),我也会非常满意。

我要寻找的输出将类似于下面的dataframe,它也将为出现多个值的地方返回多行。

                                   Summary Other_Variable_1 Other_Variable_2       Locations
1  In Cox's Bazar, this and that happened.                1                1            <NA>
2       In Yangon, something else happened                2                2            <NA>
3        In Central Karachi, this happened                3                3 Central Karachi
4                  In Sindh, this happened                4                4 Central Karachi
5                  In Sindh, this happened                4                4            Dadu
6                  In Sindh, this happened                4                4    East Karachi
7                  In Sindh, this happened                4                4          Ghotki
8                  In Sindh, this happened                4                4         Sujawal
9                  In Sindh, this happened                4                4          Sukkur
10 In Dadu AND East Karachi, this happened                5                5            Dadu
11 In Dadu AND East Karachi, this happened                5                5    East Karachi

我尝试了一些mutate和grepl函数,但没有成功。我发现的其他示例似乎只适用于精确值或单个搜索。谢谢你的帮助!

#tidyverse首选解决方案

共有1个答案

巫马曜文
2023-03-14

这里有一种方法:

library(tidyverse)

map_df(seq(nrow(test_dataset)), function(i) {
  inds <- str_detect(test_dataset$Summary[i], test_admin$adm1_name) | 
             str_detect(test_dataset$Summary[i], test_admin$adm2_name)
  if(any(inds)) tibble(test_dataset[i, ], Locations = test_admin$adm2_name[inds])
    else tibble(test_dataset[i, ], Locations = NA)
})

#  Summary                                 Other_Variable_1 Other_Variable_2 Locations      
#   <chr>                                              <int>            <int> <chr>          
# 1 In Cox's Bazar, this and that happened.                1                1 NA             
# 2 In Yangon, something else happened                     2                2 NA             
# 3 In Central Karachi, this happened                      3                3 Central Karachi
# 4 In Sindh, this happened                                4                4 Central Karachi
# 5 In Sindh, this happened                                4                4 Dadu           
# 6 In Sindh, this happened                                4                4 East Karachi   
# 7 In Sindh, this happened                                4                4 Ghotki         
# 8 In Sindh, this happened                                4                4 Sujawal        
# 9 In Sindh, this happened                                4                4 Sukkur         
#10 In Dadu AND East Karachi, this happened                5                5 Dadu           
#11 In Dadu AND East Karachi, this happened                5                5 East Karachi   

对于摘要中的每个值我们检查它是否与adm1_name匹配或adm2_name匹配。如果任何行匹配,我们将在输出中包含相应的位置值,否则返回 NA

 类似资料:
  • 问题内容: 如果我有一个简单的集合,例如: 如果我要搜索含有维生素B6的水果,则可以执行以下操作: 这样一来,我便可以看到我收藏的所有含有维生素A的水果。但是,我如何能够搜索含有多种维生素(例如维生素B6和C)的水果?我不能简单地搜索,因为那样会寻找数组,而不是独立的字符串。 在Cloud Firestore中甚至有可能吗?如果没有,还有其他替代方法吗? 问题答案: 通过在查询中链接条件来寻找匹配

  • 在Cloud Firestore中这甚至是可能的吗?如果没有的话,有没有其他方法可以做到这一点?

  • 我在R中找到了一个类似的解决方案,它使用stringr库:在字符串中搜索一个值,如果该值存在,则将其单独打印到一个新列中 下面的代码似乎可以工作,但我还希望输出我正在寻找的三个值,而这个解决方案将只输出一个值: ----编辑---- 结果 通缉结果

  • 我有一个df,在许多行和列中,'-1'出现,这是错误的数据。我试图按列删除: df.drop(df[df['region']==-1].index) 但想知道是否有办法为整个df一次做到这一点?

  • 问题内容: 问题 该代码无法正确识别输入(项目)。即使CSV文件中存在这样的值,它也只会转储到我的失败消息中。谁能帮我确定我做错了什么? 背景 我正在开发一个小程序,要求用户输入(此处未提供功能),搜索CSV文件(项目)中的特定列并返回整行。CSV数据格式如下所示。我已经从实际数量(49个字段名称,18000 +行)中缩短了数据。 码 CSV结构 笔记 我对Python的经验还很少,但是我认为这是

  • 我有两个矩阵,一个是矩阵(ncol=1,nrow=20,000),存储我要搜索的值,另一个矩阵是矩阵,存储一个大型数据集(ncol=1,nrow=5,000)。 矩阵:(,,....是行名) 矩阵:(,,,,...是行名) 我要为矩阵中的每个值查找矩阵的哪一行包含该字符串,并记录其矩阵的行名,并将其放在矩阵中该字符串行的下列列中(或在一列中,但用“,”分隔)。 例如,我希望有一个循环,首先从索引矩