我有一个数据框如下
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
答案 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