r中另一个数据帧中的部分字符串匹配
有没有办法找到从df_2到df_1的所有部分匹配 部分匹配(如果DF_1字符串的一部分在DF_2的整个字符串中) 例如,“For solution”的一部分在“solution”的整个字符串中r中另一个数据帧中的部分字符串匹配,r,dplyr,match,R,Dplyr,Match,有没有办法找到从df_2到df_1的所有部分匹配 部分匹配(如果DF_1字符串的一部分在DF_2的整个字符串中) 例如,“For solution”的一部分在“solution”的整个字符串中 这听起来像是grepl()的工作 例如,grepl(值、字符、固定=真) 让我引述 字符值grepl(值,字符) [1] 真的 >字符值grepl(值,字符) [1] 假的 这听起来像是grepl()的工作。 例如,grepl(值、字符、固定=真) 让我引述 字符值grepl(值,字符) [1] 真的 >
这听起来像是
grepl()
的工作
例如,grepl(值、字符、固定=真)
让我引述
字符值grepl(值,字符)
[1] 真的
>字符值grepl(值,字符)
[1] 假的
这听起来像是
grepl()的工作。
例如,grepl(值、字符、固定=真)
让我引述
字符值grepl(值,字符)
[1] 真的
>字符值grepl(值,字符)
[1] 假的
我们可以使用
fuzzyjoin
library(fuzzyjoin)
regex_left_join(df_2, df_1, by = c("DF_2"= "DF_1"))
我们可以使用
fuzzyjoin
library(fuzzyjoin)
regex_left_join(df_2, df_1, by = c("DF_2"= "DF_1"))
遵循@Akrun建议使用
fuzzyjoin
library(fuzzyjoin)
regex_left_join(df_2, df_1, by = c("DF_2"= "DF_1"))
根据预期的输出,您希望加入两次,并希望执行内部\u-join
。
最后,如果存在完美匹配,您将进行两次匹配,这就是您希望重复数据消除的原因(我使用distinct
fromdplyr
进行了重复数据消除,但您可以根据需要执行重复数据消除
df_out = distinct(
rbind(
regex_inner_join(df_1, df_2, by = c("DF_1"= "DF_2")),
regex_inner_join(df_2, df_1, by = c("DF_2"= "DF_1"))
)
)
df_out
输出为:
DF_1 index DF_2
1 suspension 2 suspension
2 for solution 3 solution
3 suspension 1 for suspension
4 tablet 4 tablet,ER
5 tablet 5 tablet,IR
您发现您期望的表,但顺序(行和列)不同。遵循@Akrun建议使用
fuzzyjoin
library(fuzzyjoin)
regex_left_join(df_2, df_1, by = c("DF_2"= "DF_1"))
根据预期的输出,您希望加入两次,并希望执行内部\u-join
。
最后,如果存在完美匹配,您将进行两次匹配,这就是您希望重复数据消除的原因(我使用distinct
fromdplyr
进行了重复数据消除,但您可以根据需要执行重复数据消除
df_out = distinct(
rbind(
regex_inner_join(df_1, df_2, by = c("DF_1"= "DF_2")),
regex_inner_join(df_2, df_1, by = c("DF_2"= "DF_1"))
)
)
df_out
输出为:
DF_1 index DF_2
1 suspension 2 suspension
2 for solution 3 solution
3 suspension 1 for suspension
4 tablet 4 tablet,ER
5 tablet 5 tablet,IR
您可以找到所需的表,但顺序(行和列)不同。这里有一个使用嵌套
*apply的基本R选项。
+grepl
df_out <- within(
df_2,
DF_1 <- unlist(sapply(
DF_2,
function(x) {
Filter(
Negate(is.na),
lapply(
df_1$DF_1,
function(y) ifelse(grepl(y, x), y, ifelse(grepl(x, y), x, NA))
)
)
}
), use.names = FALSE)
)
下面是一个使用嵌套的
*apply
+grepl
df_out <- within(
df_2,
DF_1 <- unlist(sapply(
DF_2,
function(x) {
Filter(
Negate(is.na),
lapply(
df_1$DF_1,
function(y) ifelse(grepl(y, x), y, ifelse(grepl(x, y), x, NA))
)
)
}
), use.names = FALSE)
)
您如何定义部分匹配?根据您的示例,是否“df_a中的字符串链完全包含在df_b中”?这是否回答了您的问题?@Arault,我在上面定义了部分匹配。如果我在df_1中的字符串的一部分在df_2中。例如,“for solution”的一部分在“solution”中,所以这是一个匹配。@Ashti在这种情况下,不应该将“for solution”与“for suspension”合并吗?两者都有“for”否,因为“for solution”的一部分作为一个整体存在于“solution”中,而不是“for suspension”作为一个整体存在于“solution”中。您如何定义部分匹配?根据您的示例,是否应该是“df_a中的字符串链完全包含在df_b中?”?这回答了你的问题吗?@Arault,我在上面定义了一个部分匹配。如果我在DF_1中的字符串的一部分在DF_2中。例如,“for solution”的一部分在“solution”中,那么这是一个匹配。@Ashti在这种情况下,“for solution”不应该与“for suspension”合并吗?两者都有“for”否,因为“for solution”的一部分在“solution”中作为一个整体,但不是作为整个字符串的“for suspension”。谢谢!这没有返回其中一行的匹配项。谢谢!这没有返回其中一行的匹配项。