【问题标题】:Match text from one column with another column (vlookup + like)将一列中的文本与另一列匹配(vlookup + like)
【发布时间】:2022-01-18 10:01:27
【问题描述】:

我正在尝试执行 2 列的匹配,但没有成功。我有一个DF1 2 列,IdJSON。在第二个DF2 中,我有一列与DF1$json 的每一行匹配的模式(类似于 vlookup + 类似函数)。

作为输出,我想得到DF1$Id,但只有DF2 中的任何一个与DF1$json 匹配。

我尝试了一些与str_detect 的组合,但它不适用于非向量值。也许有一些 grepstringr 函数的技巧?

例如:

str_detect(DF1$json, fixed(DF2[1,1], ignore_case = TRUE))

【问题讨论】:

标签: r grep stringr


【解决方案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 不同。查看您的功能,我认为您已接近预期输出。如果我能管理,我会尝试调整你的功能
    猜你喜欢
    • 2019-11-19
    • 1970-01-01
    • 2021-07-12
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多