I want to compare an undetermined number of vectors and get the common values in at least two of them.
As an example, let’s just use three vectors:
x <- c(1,3,5,7,9)
y <- c(3,6,8,9,4)
z <- c(2,3,4,5,7,9)
Reduce(intersect, list(x,y,z))
# or
intersect(x, intersect(y,z))
[1] 3 9
Expected result is:
[1] 3 4 5 7 9
CodePudding user response:
We may stack a named list to two column data.frame, get the table, check if the row wise sum is greater than or equal to 2, return the names that are TRUE for those
names(which(rowSums(table(stack(list(x= x, y = y, z = z))) > 0) >= 2))
[1] "3" "4" "5" "7" "9"
If we want to use pairwise intersect for all combinations, use combn and then Reduce with union
sort(Reduce(union, combn(list(x, y, z), 2,
FUN = function(x) intersect(x[[1]], x[[2]]), simplify = FALSE)))
[1] 3 4 5 7 9
CodePudding user response:
You can put the vectors in one large vector:
vec <- unlist(list(x, y, z))
Or, if you may have duplicates within a single contributing vector:
vec <- unlist(lapply(list(x, y, z), unique))
Then, subset based on presence of duplicates (and sort if needed):
sort(unique(vec[duplicated(vec)]))
Output
[1] 3 4 5 7 9
