2015-10-13 6 views
1

У меня есть кадр данных ниже:Выберите строки, если они содержат определенную строку, используя R

Acct <- c(1001, 1002, 1003) 
Tran <- c(01, 02, "ALL") 
Group <- c(01, 01, 02) 
DF1 <- data.frame(Acct, Tran, Group) 

Теперь мне нужно, чтобы выбрать строки, где «ALL» показывает вверх. Результат должен выглядеть следующим образом:

Acct | Tran | Group 
1003 | ALL | 2 

Одна вещь, чтобы отметить, что «ALL» может быть в любой колонке (не только «Тран») и может быть любое количество столбцов.

+0

быстрый и грязный способ является, 'DF1 <- подмножество (DF1, DF1 [1] == "ALL" | DF1 [, 2] == "ВСЕ" | DF1 [, 3] == "ВСЕ") '. Думать о лучшем пути, хотя. – Badger

+0

Используйте 'grepl' для соответствия строкам и' colnames (DF1) 'для циклического переключения по всем столбцам. – Frash

ответ

3

Вы можете использовать DF1 == "ALL", чтобы получить логическую матрицу, чтобы найти ALL. Тогда мы можем взять rowSums() этой матрицы и сохранить те, где сумма не равна нулю.

DF1[rowSums(DF1 == "ALL") != 0, ] 
# Acct Tran Group 
# 3 1003 ALL  2 
+0

было бы слишком спорным? 'DF1 [!! rowSums (DF1 ==" ALL "),]' –

+0

Некоторые люди это делают. Но я не знаю :) –

+1

Fore !!! (code golf incoming) –

2

использовать эту линию:

apply(DF1 == "ALL",1,any) 

Это приведет к Т/Р вектор, который соответствует строкам, которые содержат по крайней мере один «ВСЕ»

DF1 == "ALL" дает:

> DF1 == "ALL" 
     Acct Tran Group 
[1,] FALSE FALSE FALSE 
[2,] FALSE FALSE FALSE 
[3,] FALSE TRUE FALSE 

При использовании заявки, как указано выше, вы получаете:

> apply(DF1 == "ALL",1,any) 
[1] FALSE FALSE TRUE 

И если вы хотите строки:

> select <- apply(DF1 == "ALL",1,any) 
> DF1[select,] 

    Acct Tran Group 
3 1003 ALL  2 
Смежные вопросы