R中的多字符串匹配

时间:2016-04-14 09:58:58

标签: r string text text-analysis

考虑A,B,C,D ....作为单词。 我有两个DF。

DF1:

ColA
A B
B C
C D
E F
G H
A M
M

DF2:

ColB
A B C D X Y Z
C D M N F K L
S H A F R M T U

操作: 我想在df2中搜索df1的所有元素,然后将所有匹配的值附加到新列中,或者可以创建多行。

输出1:

ColB                    COlB
A B C D X Y Z           A,A B,B C,C D
C D M N F K L           C D,M
S H A F R M T U         A,A M

输出2:

ColB                   Output
A B C D X Y Z           A
A B C D X Y Z           A B
A B C D X Y Z           B C
A B C D X Y Z           C D
C D M N F K L           C D
C D M N F K L           M
S H A F R M T U         A
S H A F R M T U         A M

2 个答案:

答案 0 :(得分:1)

我认为这会做到这一点,虽然它与你预期的答案略有不同,我认为这是错误的。

首先设置输入数据框:

# set up the data
df1 <- data.frame(ColA = c("A B", 
                           "B C", 
                           "C D",
                           "E F",
                           "G H",
                           "A M",
                           "M"),
                  stringsAsFactors = FALSE)
df2 <- data.frame(ColB = c("A B C D X Y Z",
                           "C D M N F K L",
                           "S H A F R M T"),
                  stringsAsFactors = FALSE)

接下来,我们将形成要搜索的事物的所有成对组合:

# create a vector of patterns and items to search
intermediate <- as.vector(outer(df2$ColB, df1$ColA, paste, sep = "|"))
# split it into a list
intermediate <- strsplit(intermediate, "|", fixed = TRUE)

然后我们可以创建一个函数来匹配这个完整组合数据集的每一行的元素。核心是foundMatch,它返回一个逻辑,表明ColA中的所有元素是否都存在于{{1}中}}。在你的例子中,顺序并不重要,所以在这里我们分割元素并查找第一个元素。

ColB

不完全是你所拥有的,但我认为这是正确的。

答案 1 :(得分:0)

对我来说,如何构建data.frames df1df2并不明显。但您可以尝试矢量化数据并匹配两组。

d1 <- sort(as.character(unlist(df1)))
d2 <- sort(as.character(unlist(df2)))
# get the intersection/difference without duplicates
intersect(d1,d2)
setdiff(d1,d2)
# get all values matching with the first or with the second dataset, respectively 
d1[ d1 %in% d2 ]
d2[ d2 %in% d1 ]