Выполните непарные попарно все-все-сравнения двух неупорядоченных символьных векторов --- противоположность пересечения --- все-ко-всему setdiff - PullRequest
0 голосов
/ 26 апреля 2018

ПРИМЕРНЫЕ ДАННЫЕ

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 функция, которая бы

Ссылки.

  1. Бреял, Тони. « outersect (): противоположность функции R intersect () », ноябрь 2011 г. R-блогеры.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Может быть, это:

both <- c(unique(v1),unique(v2))
both[! (duplicated(both) | duplicated(both, fromLast = T))]
[1] "X2329323"  "N23932"    "X93201"    "X9023111"  "O92311"    "9000F"     "K9232932"  "X02311111" "U82832"   
0 голосов
/ 26 апреля 2018

Как насчет этого ...

setdiff(union(v1,v2),intersect(v1,v2))

[1] "X2329323"  "N23932"    "X93201"    "X9023111"  "O92311"    "9000F"
    "K9232932"  "X02311111" "U82832" 
...