将一列中的文本与另一列匹配(vlookup + like)
Posted
技术标签:
【中文标题】将一列中的文本与另一列匹配(vlookup + like)【英文标题】:Match text from one column with another column (vlookup + like) 【发布时间】:2022-01-18 10:01:27 【问题描述】:我正在尝试执行 2 列的匹配,但没有成功。我有一个DF1
2 列,Id
和JSON
。在第二个DF2
中,我有一列与DF1$json
的每一行匹配的模式(类似于 vlookup + 类似函数)。
作为输出,我想得到DF1$Id
,但只有DF2
中的任何一个与DF1$json
匹配。
我尝试了一些与str_detect
的组合,但它不适用于非向量值。也许有一些 grep
或 stringr
函数的技巧?
例如:
str_detect(DF1$json, fixed(DF2[1,1], ignore_case = TRUE))
【问题讨论】:
请使用dput(DF1)
和dput(DF2)
分享reproductible example
【参考方案1】:
df1 <- data.frame(
Id = c("AA", "BB", "CC", "DD"),
json = c("xxx:yyy:zzz;mmm:zzz:vvv", "ccc:yyy:zzz;ddd:zzz:vvv", "ttt:yyy:zzz;mmm:zzz:vvv", "uuu:yyy:zzz;mmm:zzz:vvv")
)
matches <- c("mmm:zzz:vvv", "mmm:yyy:zzz")
library(stringr) # needed for str_extract_all()
使用 data.table 的解决方案
library(data.table)
setDT(df1)
df1[, match := any(str_extract_all(json, "(?<=\\).+?(?=\\)")[[1]] %in% matches), by = Id]
df1[match == T, .(Id)]
使用 dplyr 的解决方案
library(dplyr)
df1 %>%
group_by(Id) %>%
mutate(match = any(str_extract_all(json, "(?<=\\).+?(?=\\)")[[1]] %in% matches)) %>%
filter(match == T) %>%
select(Id)
或者直接filter()
df1 %>%
group_by(Id) %>%
filter(any(str_extract_all(json, "(?<=\\).+?(?=\\)")[[1]] %in% matches)) %>%
select(Id)
两种方法的输出
Id
1: AA
2: CC
3: DD
【讨论】:
【参考方案2】:这会给你预期的结果吗:
my_df <- data.frame("id" = c("AA", "BB", "CC", "DD"),
"json" = c("x:y:z;m:z:v", "c:y:z;d:z:v", "t:y:z;m:z:v", "u:y:z;m:z:v"),
"pattern" = c("m:z:v", "t:y:z", "m:z:v", "t"),
stringsAsFactors = FALSE)
my_f <- function(x)
my_var <- paste(grep(pattern = my_df[x, "pattern"], x = my_df$json), collapse = " ")
return (my_var)
my_df$Value <- lapply(1:nrow(my_df), my_f)
【讨论】:
嘿,DF2(或您的示例中的“模式”)是单独的一列 DF,其行数与 DF1 不同。查看您的功能,我认为您已接近预期输出。如果我能管理,我会尝试调整你的功能以上是关于将一列中的文本与另一列匹配(vlookup + like)的主要内容,如果未能解决你的问题,请参考以下文章
返回查询的所有行,其中一列中的字符串值与另一列中的字符串值匹配
将一列与另一数据框列匹配并粘贴第二个数据中的值 - Python