如何在R中同时grep两个术语

时间:2015-08-13 11:37:43

标签: r

我有一个数据框如下

chr     Type
1     Tum,B,B,Tum
2     B,B
3     Tum,Tum
4     B,B,B,Tum

我想只选择那些将BOTH Tum和B插入到新数据帧中的行,结果如下:

chr     Type
    1     Tum,B,B,Tum
    4     B,B,B,Tum

我试过以下

PusungMix <- as.data.frame(Pusung[grep("Barr"&"Tum", Pusung$Type])

但我收到了错误

Error in "Barr" & "Tum" : 
  operations are possible only for numeric, logical or complex types

2 个答案:

答案 0 :(得分:5)

我们可以使用double grepl创建两个逻辑索引,并使用&检查两者是否为TRUE的实例。这可以用于对'df1'的行进行子集化。

 indx <- grepl('B', df1$Type) & grepl('Tum', df1$Type)
 df1[indx,]
 #  chr        Type
 #1   1 Tum,B,B,Tum
 #4   4   B,B,B,Tum

或者正如@Gaurav在评论中建议的那样,subset是另一种选择,如果我们不想使用[。我们可以删除df1$中的subset,也不必担心删除维度,因为drop=FALSE中的subset是默认值,而[ },它是drop=TRUE。因此,当我们有一个列或一行时,如果我们未在vector中明确指定drop=FALSE,则会将维度删除为[

 subset(df,grepl('B', Type) & grepl('Tum', Type))

答案 1 :(得分:2)

或纯粹的regex不需要2 grepl

indx <- grepl("Tum.*B|B.*Tum", df1$Type)
df1[indx, ]

#   chr        Type
# 1   1 Tum,B,B,Tum
# 4   4   B,B,B,Tum