我有一系列數字/字符代碼,我需要在 R 中搜索多個列,然后在至少有一個匹配項時過濾/子集資料。我已經閱讀了許多類似的堆疊溢位查詢,但似乎沒有一個與我的問題相符。
我已經嘗試了下面的代碼,但我的挑戰是它只識別以感興趣的代碼開頭的匹配項。但是,在資料中的某些情況下,代碼將出現在單元格中數字/字符序列的中間或末尾。我還需要捕獲那些實體,而不僅僅是當它以感興趣的代碼開頭時。
codes <- c("1HY85","1HZ85","1GT85","1GR85", "1OA85","1PC85","1OJ85","1OK85","1NK85","1NP85")
sub_data <- og_data %>%
filter_at(.vars = vars(Code_1:Code_10),
.vars_predicate = any_vars(str_detect(. , paste0("(", paste(codes, collapse = "|"), ")"))))
這是資料的示例:
structure(list(unique_record_id = c(1, 2, 3, 4, 5, 6, 7, 8, 9,
10), Code_1 = c("1SC27JA", "1PC85LAXXJ", "1PC85LAXXK", "1PC85LAXXK",
"1PC85LAXXJ", "1PC85LAXXK", "1PC85LAXXK", "XXJ1NK85YY", "1PC85LAXXJ",
"1PC85LAXXJ"), Code_2 = c("NA", "1PG80LD", "1PZ21HQBR1OA85",
"1PC85LAXXK", "1SY80LA", "1PC85LAXXK", "1PG87LA", "1OT53HATS",
"1PC85LAXXJ", "1JQ55GRLG"), Code_3 = c("NA", "1PG50LABJ", "NA",
"NA", "1PG80LA", "1PZ21HQBR", "1PG50LABJ", "1PZ21HPD4", "1PE76LA",
"NA"), Code_4 = c("NA", "NA", "NA", "NA", "1PG51NK850LABJ", "1IS55GRLF",
"1IS55GRLF", NA, "1PG50LABJ", "NA"), Code_5 = c("NA", "NA", "NA",
"NA", "NA", "NA", "NA", "NA", "1PG50LABJ", "NA"), Code_6 = c("NA",
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "2PC71LA", "NA"), Code_7 = c("NA",
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "2PC71LA", "NA"), Code_8 = c("NA",
"NA", "NA", "NA", "NA", "NA", "NA", "NA", "1IS53GRLF", "NA"),
Code_9 = c("NA", "NA", "NA", "NA", "NA", "NA", "NA", "NA",
"NA", "NA"), Code_10 = c("NA", "NA", "NA", "NA", "NA", "NA",
"NA", "NA", "NA", "NA")), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -10L))
uj5u.com熱心網友回復:
這是一個使用data.table. 您的示例中的預期輸出是什么?
下面我使用%ilike%并將上面的所有各種代碼組合成一個運算式,以匹配所選興趣列中的每個單元格。如果匹配則回傳 TRUE 的 data.table,否則回傳 FALSE。然后,如果任何行中有一個 TRUE,我使用applycombined withany回傳 TRUE。然后,我將子集設定為僅包含為 TRUE 的行以獲取 id 并左連接 ids 表與原始資料集。
library(data.table)
# orig == og_data
# codes == codes
orig = as.data.table(orig)
cols = names(orig)[(names(orig) %like% "Code")]
# Find matches across all relevant columns
bool_orig = copy(orig)
bool_orig[, (cols) := lapply(.SD, function(x) {x %ilike% paste0(codes,collapse = "|")}), .SDcols = cols]
# Pull ids that have at least 1 TRUE value
ids = bool_orig[, match := apply(.SD, 1, any), .SDcols = cols][(match), .(unique_record_id)]
orig[ids, on = "unique_record_id"]
# unique_record_id Code_1 Code_2 Code_3 Code_4 Code_5 Code_6 Code_7 Code_8 Code_9 Code_10
# 1: 2 1PC85LAXXJ 1PG80LD 1PG50LABJ NA NA NA NA NA NA NA
# 2: 3 1PC85LAXXK 1PZ21HQBR1OA85 NA NA NA NA NA NA NA NA
# 3: 4 1PC85LAXXK 1PC85LAXXK NA NA NA NA NA NA NA NA
# 4: 5 1PC85LAXXJ 1SY80LA 1PG80LA 1PG51NK850LABJ NA NA NA NA NA NA
# 5: 6 1PC85LAXXK 1PC85LAXXK 1PZ21HQBR 1IS55GRLF NA NA NA NA NA NA
# 6: 7 1PC85LAXXK 1PG87LA 1PG50LABJ 1IS55GRLF NA NA NA NA NA NA
# 7: 8 XXJ1NK85YY 1OT53HATS 1PZ21HPD4 <NA> NA NA NA NA NA NA
# 8: 9 1PC85LAXXJ 1PC85LAXXJ 1PE76LA 1PG50LABJ 1PG50LABJ 2PC71LA 2PC71LA 1IS53GRLF NA NA
# 9: 10 1PC85LAXXJ 1JQ55GRLG NA NA NA NA NA NA NA NA
要顯示它匹配字串的任何部分:
# run the above using "LAB" as the pattern
codes = c("LAB")
# unique_record_id Code_1 Code_2 Code_3 Code_4 Code_5 Code_6 Code_7 Code_8 Code_9 Code_10
# 1: 2 1PC85LAXXJ 1PG80LD 1PG50LABJ NA NA NA NA NA NA NA
# 2: 5 1PC85LAXXJ 1SY80LA 1PG80LA 1PG51NK850LABJ NA NA NA NA NA NA
# 3: 7 1PC85LAXXK 1PG87LA 1PG50LABJ 1IS55GRLF NA NA NA NA NA NA
# 4: 9 1PC85LAXXJ 1PC85LAXXJ 1PE76LA 1PG50LABJ 1PG50LABJ 2PC71LA 2PC71LA 1IS53GRLF NA NA
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/534905.html
標籤:r
