簡體   English   中英

如何檢查向量中的任何字符串是否存在於包含多個潛在匹配項的數據框列中

[英]How to check if any string in a vector is present in a data frame column containing multiple potential matches

我有一列包含多個代碼,我需要檢查每個代碼是否在代碼簿中。 IE,

AppliedCodes <- c("AAAA; BBBB; CCCC;", "CCCC; FFFF; GGGG", "AAAA; DDD; EEEE")
df <- data.frame(AppliedCodes)
Codebook     <- c("AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF")

在輸出中,應標記“DDD”,因為它是唯一不在 Codebook 中的。 IE,

library(tidyverse)
df2 <- df %>%
  mutate(UnknownCode = ???)

df2:

AppliedCodes      |  UnknownCode
AAAA; BBBB; CCCC; |  No
CCCC; FFFF; GGGG  |  No
AAAA; DDD; EEEE   |  Yes

我嘗試使用 str_detect 將 Codebook Vector 整理成一個長字符串,但如果任何 AppliedCodes 在 Codebook 中,則結果為 TRUE;

有沒有辦法解決這個問題?

提前致謝

首先使用strsplit在分號處拆分每個字符串,然后檢查其中是否any不是%in%您在sapply中的碼本

df %>%
  mutate(Unknown_code = sapply(strsplit(AppliedCodes, "; *"),
                               function(x) any(!x %in% Codebook)))
#>        AppliedCodes Unknown_code
#> 1 AAAA; BBBB; CCCC;        FALSE
#> 2  CCCC; FFFF; GGGG         TRUE
#> 3   AAAA; DDD; EEEE         TRUE

請注意,GGGG 沒有出現在您的示例代碼簿中,因此這也被標識為未知代碼。

這是一個替代解決方案,它具有附加價值,可以准確地告訴您哪些代碼不在 Codebook 中:

df %>%
  # prepare data for transformation:
  mutate(
    # create row identifier:
    ID = row_number(),
    # tidy-up by removing trailing ";":
    AppliedCodes = sub("\\W$", "", AppliedCodes)) %>%
  # separate `Appliedcodes` values into rows:
  separate_rows(AppliedCodes, sep = "; ?(?!$)") %>%
  # match unknown values:
  mutate(Unknown_code = !str_detect(AppliedCodes, paste0(Codebook, collapse = "|"))) %>%
  # for each `ID`:
  group_by(ID) %>%
  # paste values together:
  summarise(
            AppliedCodes = str_c(AppliedCodes, collapse = ','),
            Unknown_code = str_c(Unknown_code, collapse = ','))
# A tibble: 3 × 3
     ID AppliedCodes   Unknown_code     
  <int> <chr>          <chr>            
1     1 AAAA,BBBB,CCCC FALSE,FALSE,FALSE
2     2 CCCC,FFFF,GGGG FALSE,FALSE,TRUE 
3     3 AAAA,DDD,EEEE  FALSE,TRUE,FALSE

從中可以看出, Codebook中不僅沒有DDD ,還有GGGG

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM