2013-08-02 43 views
1

我总是命令如下工作:组合逻辑陈述功能

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 - 备用(*首选*恕我直言)设计的最后一点是存储为逻辑:'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)] 

你的第二个问题 - 这是你追求的:

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)) 

b

a))的使用which

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

c)使用match

with(mydata,match(y,c("A", "B", "C")))