我有一个包含两列的数据框:一个ID号,然后是一个文本字符串:

df <- data.frame(ID=c(1, 2, 3, 4, 5, 6, 7, 8), 
                 text = c("lorem ipsum dolor sit ABC, consectetur adipiscing XYZ",
                          "veritatis et quasi ABC architecto beatae vitae dicta YXZ explicabo", 
                          "dignissimos ducimus CBA blanditiis praesentium ZXY deleniti", 
                          "earum rerum hic BCA tenetur a sapiente delectus, ut aut XYZ", 
                          "enim ad minima veniam, ACB quis nostrum corporis ZYX suscipit",
                          "cillum dolore BAC eu fugiat nulla pariatur ZXY",
                          "sunt CBA, ABC in culpa qui officia deserunt mollit XYZ anim",
                          "debitis ACB aut rerum necessitatibus YZX, XZY saepe eveniet"))

我还有两个包含特定搜索词的不同列表:

listX <- c("ABC", "ACB", "BAC", "BCA", "CAB", "CBA")
listY <- c("XYZ", "XZY", "YXZ", "YZX", "ZXY", "ZYX")

我想搜索数据框每行的文本,并构建一个新的数据框,其中一列包含ID号,其他列包含listXlistY中特定搜索项的匹配/组合结果.

output <- data.frame(ID=c(1,2,3,4,5,6,7,7,8,8),
                     X=c("ABC","ABC","CBA","BCA","ACB","BAC","CBA","ABC","ACB","ACB"),
                     Y=c("XYZ","YXZ","ZXY","XYZ","ZYX","ZXY","XYZ","XYZ","YZX","XZY"))

有没有办法以编程方式生成包含每种可能组合的输出数据框?我知道,对于不同的结果,我可能会用greplmerge以某种方式做到这一点.但这将是一种丑陋的暴力手段,而且 list 比本例中给出的要长得多.提前谢谢您!

推荐答案

library(dplyr)
library(stringr)
library(tidyr)

df |>
  mutate(X = str_extract_all(text, str_flatten(listX, "|")),
         Y = str_extract_all(text, str_flatten(listY, "|")),
         across(X:Y, ~ replace(., lengths(.) == 0, NA))) |>
  unnest_longer(X:Y)

注意:在创建正则表达式时,可以考虑使用单词边界(\\b).这样一来,"ABC"和"ABCDE"就不匹配了.它应该看起来像是:

str_c("\\b", listX, "\\b", collapse = "|"))

Edit

str_extract_all未找到匹配项时,它返回零长度(空)向量:

x <- str_extract_all(c("This is a test.", "Another test ABC."), "ABC")
# [[1]]
# character(0)
# 
# [[2]]
# [1] "ABC"

当您try 将一个空向量与另一个向量组合时,此元素将被简单地删除:

unlist(x)
# [1] "ABC"

因此,我添加了行across(...)来替换unnest语句之前的空值,以纠正这种行为.

R相关问答推荐

删除facet_wrap标签之间的水平线

在(g)子中使用asserable字符

在位置周围设定一个半径并识别该半径内的其他位置

随机森林回归:下拉列重要性

R Sapply函数产生的值似乎与for循环方法略有不同

使用strsplit()将向量操作为数据框

R-更新面内部的栅格值

R—将各种CSV数字列转换为日期

R中边际效应包中Logistic回归的交互作用风险比

函数可以跨多个列搜索多个字符串并创建二进制输出变量

如何在R中使用hmm TMB提前一步预测观察到的状态?

如何在ggplot2中创建多个y轴(每个变量一个)

扩展R中包含列表的数据框

如何对r中包含特定(未知)文本的行求和?

删除数据帧中特定行号之间的每第三行和第四行

如何根据其他列中的两个条件来计算数据帧中的行之间的差异?

是否有一个R函数可以输出在输入的字符向量中找到的相应正则表达式模式?

Ggplot2:添加更多特定 colored颜色 的线条

将日期列从字符转换为日期得到的结果是NAS

具有某些列的唯一值的数据帧