3

我一直在使用这样的命令:

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()功能上也有同样的问题,所以为了一个通用的解决方案,我有吹牛的权利。

4

3 回答 3

10
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] ]
于 2013-08-02T21:59:43.687 回答
3

根据@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")))
于 2013-08-02T22:25:34.110 回答
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")
于 2013-08-02T21:57:43.243 回答