2013-08-02 2 views
1

Я всегда работаю с командами, как это:Комбинирование логических операторов в R, который() и IfElse() функции

which(foo$bar == 'A' | foo$bar == 'B' | foo$bar == 'C') 

Поскольку все они связаны с одной и той же переменной, я хотел бы быть в состоянии чтобы очистить мой код и сделать что-то вроде этого:

which(foo$bar == 'A|B|C') # such syntax works in grep, why not here? 
# or... 
which(foo$bar == c('A', 'B', 'C')) 

Но все это не работает! Я почти уверен, что должно быть простое решение, я просто не могу его найти. У меня такая же проблема в функциях ifelse(), так что бонусы хвастаются за универсальное решение.

ответ

9
with(foo, which(bar %in% LETTERS[1:3])) 

Может использоваться для выбора строк из фрейма данных. Кроме того, можно использовать это в качестве логического индекса в векторе репортера, хотя и с логической индексации вы должны помнить, что индексы R не 0 на основе .:

set.seed=(123) 
    foo <- data.frame(bar=sample(LETTERS[1:15], 10)) 
    c("Not in A|B|C", "In A|B|C") [ 1+ foo$bar %in% LETTERS[1:3] ] 
+0

+1 - альтернативный (* предпочтительный * IMHO) дизайн для этого последнего бита должен хранить как логический: 'foo $ in.ABC <- foo $ bar% in% LETTERS [1: 3]' – flodel

0

Используя логическую версию grep:

foo <- letters[1:5] 
foo[grepl("[a-c]", foo)] 
seq_along(foo)[grepl("[a-c]", foo)] 

Ваш 2-й вопрос - это то, что вы после:

ifelse (sum(grepl("[a-c]", foo))==3, "abc present", "abc absent") 

(Использует sum для преобразования логичнее числовой)

Или что-то делать, если какая-либо из букв присутствует:

if (any(letters[1:3] %in% foo)) print("abc present") 
+1

Я думаю, что вопрос, если любой из них присутствует, то код будет иметь незначительные изменения IfElse (сумма (grepl («[AC]» , foo))> 0, "abc present", "abc absent") –

+0

Спасибо, хорошая точка. – dardisco

2

По @baptiste

mydata<-structure(list(y = c("A", "B", "C", "D", "E")), 
    .Names = "y", class = "data.frame", row.names = c(NA, -5L)) 
mydata 
    y 
1 A 
2 B 
3 C 
4 D 
5 E 

Три решения:

а) с помощью ifelse

with(mydata,ifelse(y %in% c("A","B","C"),1,0)) 

б) с использованием which

with(mydata,which(y %in% c("A","B","C"))) 

с) с использованием match

with(mydata,match(y,c("A", "B", "C"))) 
Смежные вопросы