我正在寻找一个带有数据帧列的函数,检查它是否包含字符串向量中的文本,并在匹配时对其进行过滤(包括部分文本匹配)。
例如,请采用以下数据框:
print(foo)
和以下载体
animal |count
aardvark |8
cat |2
catfish |6
dog |12
dolphin |3
penguin |38
prairie dog|59
zebra |17
我想要经历这种动物'列,检查值是否完全或部分匹配向量中的一个字符串,并过滤掉那些不是的字符串。结果数据框将是:
c("cat", "dog")
谢谢!
肖恩
答案 0 :(得分:8)
使用dplyr
,您可以尝试以下操作,假设您的表格为df
:
library(dplyr)
library(stringr)
animalList <- c("cat", "dog")
filter(df, str_detect(animal, paste(animalList, collapse="|")))
我个人觉得在审核我的代码几个月之后,dplyr
和stringr
的使用会更容易阅读。
答案 1 :(得分:5)
我们可以使用grep
df1[grep(paste(v1, collapse="|"), df1$animal),]
或使用dplyr
df1 %>%
filter(grepl(paste(v1, collapse="|"), animal))
答案 2 :(得分:0)
对于大型数据集,以下base R
方法可以比接受的答案快15倍地完成工作。至少那是我的经验。
代码生成一个新的数据框,以存储与给定值(动物)匹配的行的子集。
#Create placeholder data frame
new_df <- df[0, ]
#Create vector of unique values
animals <- unique(df$animal)
#Run the loop
for (i in 1:length(animals)){
temp <- df[df$animal==animals[i], ]
new_df <- rbind(new_df,temp)
}