Проверьте, содержат ли два вектора одинаковые (неупорядоченные) элементы в R

Я хотел бы проверить, содержат ли два вектора одни и те же элементы, даже если они не упорядочены одинаково. Например, функция (пусть называется SameElements) должна удовлетворять следующим критериям:

SameElements(c(1, 2, 3), c(1, 2, 3))  # TRUE
SameElements(c(1, 2, 3), c(3, 2, 1))  # TRUE
SameElements(c(1, 2, 1), c(1, 2))  # FALSE
SameElements(c(1, 1, 2, 3), c(3, 2, 1))  # FALSE

Изменить 1: Указала, что функция должна возвращать F, если векторы содержат одни и те же элементы, но с разными частотами.

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

Ответы

Ответ 1

Вместо более чистой альтернативы, здесь известное решение:

SameElements <- function(a, b) return(identical(sort(a), sort(b)))
SameElements(c(1, 2, 3), c(1, 3, 2))  # TRUE
SameElements(c(1, 2, 3), c(1, 1, 3, 2))  # FALSE

Изменить: identical вместо all.equal(...) == T на предложение nrussell.

Ответ 2

Я думаю, вы можете использовать setequal(a,b)

Обновленное обновление setequal проверяет, состоят ли два вектора из одних и тех же элементов, но не проверяет, имеют ли эти элементы одинаковые вхождения в каждом векторе.

Ответ 3

Вам может быть интересен пакет "сравнить". Этот ответ демонстрирует функцию compare(), но для вашего случая вы можете отлично справиться с compareIgnoreOrder() (который почти совпадает с вашим типом вопроса).

Есть несколько аргументов, которые могут быть добавлены как преобразования, которые должны быть разрешены при попытке сравнить элементы. В приведенных ниже примерах (чтобы сохранить некоторую типизацию) я попросил функцию разрешить все преобразования (allowAll = TRUE), кроме изменения длины вектора (shorten = FALSE).

library(compare)
compare(A1, A2, allowAll = TRUE, shorten = FALSE)
# TRUE
compare(A1, A3, allowAll = TRUE, shorten = FALSE)
# TRUE
#   sorted
compare(A1, A4, allowAll = TRUE, shorten = FALSE)
# FALSE
#   sorted
compare(B1, B2, allowAll = TRUE, shorten = FALSE)
# FALSE
#   sorted
compare(B1, A4, allowAll = TRUE, shorten = FALSE)
# FALSE
#   sorted
compare(A3f, A1, allowAll = TRUE, shorten = FALSE)
# TRUE
#   coerced from <numeric> to <factor>
#   sorted

Пример данных:

A1 <- c(1, 2, 3); A2 <- c(1, 2, 3)
A3 <- c(3, 2, 1); A4 <- c(1, 1, 2, 3)
B1 <- c(1, 2, 1); B2 <- c(1, 2)
A3f <- factor(A3)

Ответ 4

Вот мое решение:

SameElements <- function (a,b){
  l <- Map(table,list(a, b)) # Compute frequencies - returns ordered table
  Reduce(identical,l) # Check if frequencies are the same for all input vectors
}

SameElements(c(1, 2, 3), c(1, 2, 3))  # TRUE
SameElements(c(1, 2, 3), c(3, 2, 1))  # TRUE
SameElements(c(1, 2, 1), c(1, 2))  # FALSE
SameElements(c(1, 1, 2, 3), c(3, 2, 1))  # FALSE

Как вы можете видеть, он работает для любого количества входных векторов, пока вы помещаете их в список.

Один вкладыш:

Reduce(identical,Map(table,listOfVectors))