Проверить совпадение и порядок между двумя векторами в R

Я хотел бы проверить соответствие и порядок между двумя векторами. Я знаю о функции совпадения; есть ли оверлеи для одновременной оценки заказа? Например:

x <- c("a", "b", "c")
y <- c("b", "a", "c")   
x %in% y    

Есть идеальные совпадения, но порядок неправильный. Мысли о том, как это определить? Спасибо.


person coding_heart    schedule 30.04.2014    source источник
comment
попробуйте all.equal(x,y), чтобы увидеть, одинаковый ли порядок, и all.equal(sort(x),sort(y)), чтобы увидеть, тот же ли контент, но в другом порядке   -  person Gary Weissman    schedule 30.04.2014
comment
Одной простой мерой порядка будет mean(x==y) - треть вашего примера находится в одном и том же месте. Если вы хотите измерить порядок каким-то другим способом (количество парных обменов, которые преобразуют один в другой, циклы,...), то нам нужно знать, какие порядки вы считаете похожими.   -  person Gavin Kelly    schedule 30.04.2014
comment
Как насчет просто x[x == y]?   -  person Rich Scriven    schedule 30.04.2014


Ответы (1)


test_match_order <- function(x,y) {

if (all(x==y)) print('Perfect match in same order')

if (!all(x==y) && all(sort(x)==sort(y))) print('Perfect match in wrong order')

if (!all(x==y) && !all(sort(x)==sort(y))) print('No match')
}

test_match_order(x,y)

[1] "Perfect match in wrong order"

А вот еще одна версия, основанная на моем первоначальном комментарии выше, с улучшением от @alexis_laz ниже, которое делает функцию более надежной:

test_match_order2 <- function(x,y) {

if (isTRUE(all.equal(x,y))) print('Perfect match in same order')

if (!isTRUE(all.equal(x,y)) && isTRUE(all.equal(sort(x),sort(y)))) print('Perfect match in wrong order')

if (!isTRUE(all.equal(x,y)) && !isTRUE(all.equal(sort(x),sort(y)))) print('No match')
}
person Gary Weissman    schedule 30.04.2014
comment
Использование == выглядит немного уязвимым; например xx = c(1-0.9, 0.2); yy = c(0.2, 0.1); xx; yy; test_match_order(xx, yy) - person alexis_laz; 30.04.2014
comment
@alexis_laz хорошее замечание. есть ли у OP такой сценарий, в котором повторное объявление типа было бы более надежным? - person Gary Weissman; 01.05.2014
comment
ОП, похоже, доволен :). Ваш подход all.equal в вашем комментарии (завернутый в isTRUE(.)), кажется, содержит меньше сюрпризов, не так ли? - person alexis_laz; 01.05.2014
comment
Да, all.equal мне нравился больше, но я не знал, как обеспечить вывод в виде логического значения и избежать дескрипторов вариантов, которые он создает, когда FALSE. Спасибо за isTRUE() -- для меня это ново. Прохладно :) - person Gary Weissman; 01.05.2014