我总是使用这样的命令:
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()
函数中遇到了同样的问题,因此通用解决方案的吹嘘权利也是如此。
答案 0 :(得分: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] ]
答案 1 :(得分: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
三种解决方案:
a)使用ifelse
with(mydata,ifelse(y %in% c("A","B","C"),1,0))
b)使用which
with(mydata,which(y %in% c("A","B","C")))
c)使用match
with(mydata,match(y,c("A", "B", "C")))
答案 2 :(得分: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")