r - 过滤包含向量的字符串的行

时间:2016-08-02 15:29:11

标签: r dplyr

我正在寻找一个带有数据帧列的函数,检查它是否包含字符串向量中的文本,并在匹配时对其进行过滤(包括部分文本匹配)。

例如,请采用以下数据框:

print(foo)

和以下载体

animal     |count
aardvark   |8
cat        |2
catfish    |6
dog        |12
dolphin    |3
penguin    |38
prairie dog|59
zebra      |17

我想要经历这种动物'列,检查值是否完全或部分匹配向量中的一个字符串,并过滤掉那些不是的字符串。结果数据框将是:

c("cat", "dog")

谢谢!

肖恩

3 个答案:

答案 0 :(得分:8)

使用dplyr,您可以尝试以下操作,假设您的表格为df

library(dplyr)
library(stringr)
animalList <- c("cat", "dog")
filter(df, str_detect(animal, paste(animalList, collapse="|")))

我个人觉得在审核我的代码几个月之后,dplyrstringr的使用会更容易阅读。

答案 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)
}