将Vector与多列匹配,返回索引和其他列中的对应值

时间:2017-05-17 10:23:29

标签: r dataframe match

我有一个数据框:

a = c(1, 2, 3, 4, 9) 
b = c(5, 6, 7, 8, 10) 
c = c('xx','yy','zz', 'kk', 'bb') 
df = data.frame(a, b, c) 

> df
  a  b  c
1 1  5 xx
2 2  6 yy
3 3  7 zz
4 4  8 kk
5 9 10 bb

一个整数向量:

> names
[1] 1 3 5 8
Levels: 1 3 5 8

我可以使用df返回namesa匹配列bmatch的索引:

> match(names, df$a)
[1]  1  3 NA NA
> match(names, df$b)
[1] NA NA  1  4

我想结合上面两个语句,对于返回的索引,返回c列中对应的特定索引值,以便输出为:

out = [1] "xx" "zz" "xx" "kk"

我试着这样做:

> df$c[match(names, df$a) | match(names, df$b)]
[1] "xx" "yy" "zz" "kk" "bb"

但是当它成为布尔测试时,它不能按要求运行。

如何实现所需的输出?非常感谢。

2 个答案:

答案 0 :(得分:3)

我们可以尝试使用c并指定nomatch = 0

df$c[c(match(names, df$a, nomatch = 0), match(names, df$b, nomatch=0))]
#[1] xx zz xx kk
#Levels: bb kk xx yy zz

如果我们想要as.character

,请用character换行

答案 1 :(得分:1)

df$c[c(which(df$a %in% names) , which(df$b %in% names))]

# [1] xx zz xx kk