2015-08-13 4 views
3

У меня есть dataframe следующегоКак Grep два члена в то же время в R

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

Я хотел бы выбрать только те строки, которые ОБА Тум и B должны быть вставлены в новую dataframe с следующий результат:

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 

ответ

5

Мы можем использовать двойной grepl создать два логических индекса и проверить, за исключением случаев, когда оба истинны, используя &. Это можно использовать для подмножества строк '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

'подмножество (DF, grepl ('B', df1 $ Тип) & grepl ('Tum', df1 $ Тип)) 'будет работать тоже – Gaurav

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 
Смежные вопросы