由于行名索引也适用于向量,我们可以更进一步并定义:
'%ino%' <- function(x, table) {
xSeq <- seq(along = x)
names(xSeq) <- x
Out <- xSeq[as.character(table)]
Out[!is.na(Out)]
}
我们现在得到了想要的结果:
df[rownames(df) %ino% vec, 1]
[1] 2 1 3
在函数内部,names() 会自动转换为字符,并使用 as.character() 更改表,因此当 %ino% 的输入是数字时,这也可以正常工作:
LETTERS[1:26 %in% 4:1]
[1] "A" "B" "C" "D"
LETTERS[1:26 %ino% 4:1]
[1] "D" "C" "B" "A"
在 %in% 之后,删除缺失值:
LETTERS[1:26 %in% 3:-5]
[1] "A" "B" "C"
LETTERS[1:26 %ino% 3:-5]
[1] "C" "B" "A"
使用 %in% 时,逻辑序列会沿着被子集化的对象的维度重复,而 %ino% 则不是这样:
data.frame(letters, LETTERS)[1:5 %in% 3:-5,]
letters LETTERS
1 a A
2 b B
3 c C
6 f F
7 g G
8 h H
11 k K
12 l L
13 m M
16 p P
17 q Q
18 r R
21 u U
22 v V
23 w W
26 z Z
data.frame(letters, LETTERS)[1:5 %ino% 3:-5,]
letters LETTERS
3 c C
2 b B
1 a A