Я пытаюсь сгруппировать свои данные по очень конкретному c условию. Ниже рассмотрим data.frame:
from <- c("a", "b", "a", "b")
to <- c("b", "a", "b", "a")
give <- c("x", "y", "y", "x")
take <- c("y", "x", "x", "y")
amount <- c(1, 2, 3, 4)
df <- data.frame(from, to, give, take, amount)
, который создает что-то вроде:
| from | to | give | take | amount
---------------------------------------
1 | a | b | x | y | 1
2 | b | a | y | x | 2
3 | a | b | y | x | 3
4 | b | a | x | y | 4
Чтобы обеспечить некоторую предысторию: рассмотрим, как какой-то пользователь в столбце «из» дает что-то (в столбце «даешь») ') пользователю в столбце' to 'и что-то взамен (в столбце' take '). Как вы можете видеть, строки 1 и 2 одинаковы, потому что они описывают один и тот же сценарий, просто формируют другую перспективу. Поэтому я хочу, чтобы они принадлежали к одной группе. (Вы также можете рассматривать их как дубликаты, которые включают в себя одну и ту же задачу, то есть идентифицировать их как сходные.) То же самое относится к строкам 3 и 4. Сумма - это некоторое значение, которое нужно суммировать по группе, чтобы проиллюстрировать пример.
Мой желаемый результат для их группировки заключается в следующем.
| user1 | user2 | given_by_user1 | taken_by_user1 | amount
-----------------------------------------------------------
| a | b | x | y | 3 # contains former rows 1&2
| a | b | y | x | 7 # contains former rows 3&4
Обратите внимание, что и от, и до , и дают и берут необходимость путем инвертирования, то есть, принимая значения из двух столбцов, сортируя их значения и считая их равными на этом основании, не то, что мне нужно. Это приведет к тому, что все четыре строки в приведенном выше примере будут считаться равными. Такое решение было предложено в аналогичных публикациях, например:
Удалите дубликаты, если значения поменялись местами в 2 столбцах в R
Я прочитал много похожих решений и нашел тот, который действительно делает трюк:
соответствует двум столбцам с двумя другими столбцами
Однако предлагаемое решение создает outer
произведение двух столбцов, которое не выполнимо в моем случае, потому что мои данные имеют миллионы строк и по крайней мере тысячи уникальных значений в каждом столбце.
(Любое решение, которое либо группирует строки напрямую, либо получает индексы строк, принадлежащих к той же группе было бы здорово!)
Большое спасибо за любые предложения!