我有一个数据框(dim 2914 x 6),其中一列是动物组和物种缩写的向量,例如“bird_F.pw”,并且我有一个包含几个物种缩写的单独向量,例如“F.pw”。我试图提取数据框中动物组和物种缩写与缩写相似的所有数据行(即,我不知道前缀)。我想使用 %in% 和 %like% 等运算符,但我无法找到生成不相同匹配的方法。
这是一个示例数据框:
df<-cbind(
c("A","B","C","D","E"),
c(1:5),
c("insect_F.vp","bird_L.ts","insect_P.qr","insect_V.cl","bird_H.dw"))
colnames(df) <- c("season","survey_id","pollinator")
Run Code Online (Sandbox Code Playgroud)
这是我想在该数据框中搜索的缩写向量:
abbrevs <- c("L.ts","P.qr","H.dw")
Run Code Online (Sandbox Code Playgroud)
我的预期结果是:
output <- cbind(c("B","C","E"),c(2:3,5),c("bird_L.ts","insect_P.qr","bird_H.dw"))
colnames(output) <- colnames(df)
Run Code Online (Sandbox Code Playgroud)
如果您不想使用正则表达式,可以使用这些替代方案。这是一个 tidyverse 的
find_any_fixed <- function(x, patterns) {
purrr::map(patterns, ~stringr::str_detect(x, stringr::fixed(.x))) |> purrr::reduce(`|`)
}
Run Code Online (Sandbox Code Playgroud)
这是基本 R 版本
find_any_fixed <- function(x, patterns) {
Map(function(.x) grepl(.x, x, fixed=TRUE), patterns) |> Reduce(`|`, x=_)
}
Run Code Online (Sandbox Code Playgroud)
在这两个解决方案中,我确保使用“固定”选项,因为“。” 当您使用正则表达式时,意味着一些特殊的东西。由于您似乎想要完全匹配句点,因此您需要让搜索工具知道您没有使用正则表达式
您可以使用它来查找匹配的模式。这些示例假设df是一个 data.frame ( df <- as.data.frame(df))。例如
find_any_fixed(df$pollinator, abbrevs)
# [1] FALSE TRUE TRUE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
你可以用它来子集
# Tidyverse
df %>% filter(find_any_fixed(pollinator, abbrevs))
# Base R
subset(df, find_any_fixed(pollinator, abbrevs))
Run Code Online (Sandbox Code Playgroud)