![](/img/trans.png)
[英]Remove any data frame rows containing a value in one column which has multiple matches in another column
[英]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.