2014-10-03 6 views
1

у меня есть два вектора данных, например .:R выяснить соответствие между векторами

vec1 <- c("u", "v", "m", "s", "c","m", "m", "a", "k", "b", "g", "h", "m", "m", "j", "r") 
vec2 <- c(1 , 2 , 3 , 4 , 5 , 3, 3 , 6 , 7 , 8 , 9 ,10, 3, 3, 11, 12) 

Отображение был применен к обоим, например в приведенном выше примере «1» в vec2 отображает «u» в vec1, «3» отображается на «m» и т. д.

Есть ли способ в R, чтобы узнать отображение, учитывая только векторы в качестве входных данных ?

ответ

3

Положите их в data.frame и удалить дублированные строки.

> tmp <- data.frame(vec1, vec2) 
> unique(tmp) 
    vec1 vec2 
1  u 1 
2  v 2 
3  m 3 
4  s 4 
5  c 5 
8  a 6 
9  k 7 
10 b 8 
11 g 9 
12 h 10 
15 j 11 
16 r 12 
+1

уверен, почему нет. Не реализовал уникальную работу таким образом на data.frame. Хорошо знать! – Dason

1

Это может быть способ сделать это:

> tmp <- as.data.frame(table(vec1, vec2)) 
> tmp[tmp$Freq!=0,] 
    vec1 vec2 Freq 
11  u 1 1 
24  v 2 1 
32  m 3 5 
46  s 4 1 
51  c 5 1 
61  a 6 1 
79  k 7 1 
86  b 8 1 
100 g 9 1 
113 h 10 1 
126 j 11 1 
141 r 12 1 
2

Используйте vec1 как имена vec2. Таким образом, вы можете использовать именованный вектор с «[» функции для доступа к неявное отображение:

> names(vec2) <- vec1 
> vec2["v"] 
v 
2 

Заметьте, что будет возвращен только первый матч. И если вы хотите, чтобы удалить дубликаты:

> vec2[!duplicated(vec2)] 
u v m s c a k b g h j r 
1 2 3 4 5 6 7 8 9 10 11 12 

Если вы хотите, чтобы вытащить подмножества, используйте% в% функции, которая строит логический индекс:

> vec2[ names(vec2) %in% letters[10:15] ] 
m m m k m m j 
3 3 3 7 3 3 11