首页 > 解决方案 > 检查列是否包含列表中的值并将该值分配给新列

问题描述

我有一个包含要查找的模式的列表。然后我有一个data.table,我想在其中查找值是否包含任何其他模式,然后将该值分配给一个新列:

library(data.table)
library(stringr)
base_patters <- c("pat1","pat2","pat3")

transformations <- data.table(mynames = c("HI_pat1_jo","A2_a4_pat1_LN","pat3_LN")
)

for( patt in base_patters){
  transformations[stringr::str_detect(transformations[, mynames], patt), pattern := patt]  
}

我已经用 for 循环解决了(如你所见),但我正在寻找一种更有效的方法来做到这一点。

标签: rdata.table

解决方案


将它们粘贴base_patters在一起并用于str_extract提取mynames.

library(data.table)
library(stringr)

transformations[,pattern := str_extract(mynames,str_c(base_patters,collapse = "|"))]

#         mynames pattern
#1:    HI_pat1_jo    pat1
#2: A2_a4_pat1_LN    pat1
#3:       pat3_LN    pat3

推荐阅读