Выполните непарные попарно все-все-сравнения двух неупорядоченных символьных векторов --- противоположность пересечения --- все-ко-всему setdiff
ПРИМЕР ДАННЫХ
v1 <- c("E82391", "X2329323", "C239923", "E1211", "N23932", "F93249232", "X93201", "X9023111", "O92311", "9000F", "K9232932", "L9232932", "X02311111")
v2 <- c("L9232932", "C239923", "E1211", "E82391", "F93249232", "U82832")
ПРОБЛЕМА
Я хочу извлечь только те элементы, которые находятся в одном из векторов, а не в другом.
Я это понимаю setdiff
не может сравнить два неупорядоченных символьных вектора и найти все различия между ними..
Например, %in%
выполнить все-все сравнения двух символьных векторов?
В этом случае он работает (хотя он не сообщает о тех элементах, которые находятся в v2
и не в v1
).
> v1[!v1 %in% v2]
[1] "X2329323" "N23932" "X93201" "X9023111" "O92311" "9000F" "K9232932" "X02311111"
Другой способ - использовать пользовательскую функцию с именем outersect
как показано здесь, который показывает все различия.
outersect <- function(x, y) {
sort(c(x[!x%in%y],
y[!y%in%x]))
}
outersect(v1,v2)
ВОПРОС
Мне действительно интересно узнать, существуют ли какие-либо функции R, которые легко могли бы выполнять все-все-сравнения между двумя символами! Идея состоит в том, чтобы действительно улучшить читаемость кода (особенно, когда существуют десятки векторов, которые нужно сравнивать друг с другом).
Какой самый безопасный и эффективный способ выполнить такое сравнение? Более конкретно, есть ли в R функция, которая бы
Рекомендации.
- Бреял, Тони. "outersect (): противоположность функции R intersect()", ноябрь 2011 г. R-блогеры.
2 ответа
Как насчет этого...
setdiff(union(v1,v2),intersect(v1,v2))
[1] "X2329323" "N23932" "X93201" "X9023111" "O92311" "9000F"
"K9232932" "X02311111" "U82832"
Может быть, это:
both <- c(unique(v1),unique(v2))
both[! (duplicated(both) | duplicated(both, fromLast = T))]
[1] "X2329323" "N23932" "X93201" "X9023111" "O92311" "9000F" "K9232932" "X02311111" "U82832"