Группа R по точно перевернутым столбцам для больших данных - PullRequest
1 голос
/ 22 апреля 2020

Я пытаюсь сгруппировать свои данные по очень конкретному 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 произведение двух столбцов, которое не выполнимо в моем случае, потому что мои данные имеют миллионы строк и по крайней мере тысячи уникальных значений в каждом столбце.

(Любое решение, которое либо группирует строки напрямую, либо получает индексы строк, принадлежащих к той же группе было бы здорово!)

Большое спасибо за любые предложения!

...