Вот еще один вариант без сортировки каждой строки.
Идея состоит в том, чтобы объединить каждый столбец набора данных со значениями поиска, столбец за столбцом. Например, для столбца A используйте все 5 значений, чтобы отфильтровать исходный набор данных.
Затем для столбца B объедините, используя то, что не использовалось в столбце A для каждого подмножества набора данных из предыдущего шага.
Затем для столбца C объедините, используя то, что не использовалось в столбцах A и B для каждого подмножества набора данных из предыдущего шага.
Затем для столбца D объедините, используя то, что не использовалось в столбцах A, B и C для каждого подмножества набора данных из предыдущего шага.
И так далее, и тому подобное.
Вот реализация вышеуказанной идеи в data.table
:
v <- c(10, 20, 30, 40, 40)
nm <- names(dat)
dat <- dat[.(A=unique(v)), on=.(A), nomatch=0L]
for (k in seq_along(nm)[-1L]) {
dat <- dat[, .SD[.(unique(v[-match(.BY, v)])),
on=eval(nm[k]),
nomatch=0L],
by=eval(nm[seq_len(k)[-k]])]
}
dat
вывод для v <- c(10, 20, 30, 40, 40)
:
A B C D E
1: 10 40 40 20 30
2: 40 40 10 20 30
3: 40 40 10 20 30
вывод для v <- c(10, 20, 30, 40, 50)
:
A B C D E
1: 30 10 20 50 40
2: 50 40 10 20 30
данные:
library(data.table)
dat <- fread("A B C D E
1 5 7 19 2
90 12 8 45 30
30 10 20 50 40
33 11 22 55 44
50 40 10 20 30
40 40 10 20 30
40 40 10 20 30
10 40 40 20 30") #2 dupe rows to demonstrate edge case