Проверьте, содержат ли два вектора одинаковые (неупорядоченные) элементы в 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))