Подтвердить что ты не робот

Объединить строки в кадре данных

У меня есть реляционный набор данных, где я ищу диадическую информацию.

У меня 4 столбца. Sender, Receiver, Attribute, Edge

Я ищу, чтобы повторить счетчик Sender-Receiver и преобразовать их как дополнительные ребра.

df <- data.frame(sender = c(1,1,1,1,3,5), receiver = c(1,2,2,2,4,5), 
                attribute = c(12,12,12,12,13,13), edge = c(0,1,1,1,1,0))

   sender receiver attribute edge
1       1        1        12    0
2       1        2        12    1
3       1        2        12    1
4       1        2        12    1
5       3        4        13    1

Я хочу, чтобы конечный результат выглядел так:

  sender receiver attribute edge
1      1        1        12    0
2      1        2        12    3
3      3        4        13    1

Если связь между дублирующими отправителями-получателями была объединена и количество дубликатов включено в число ребер.

Любой ввод будет действительно оценен.

Спасибо!

4b9b3361

Ответ 1

plyr - ваш друг, хотя я думаю, что ваш конечный результат не совсем корректен с учетом входных данных.

library(plyr)

ddply(df, .(sender, receiver, attribute), summarize, edge = sum(edge))

Возвращает

  sender receiver attribute edge
1      1        1        12    0
2      1        2        12    3
3      3        4        13    1
4      5        5        13    0

Ответ 2

Для развлечения здесь есть две другие опции: сначала используйте базовую функцию aggregate(), а вторую - с помощью пакета data.table:

> aggregate(edge ~ sender + receiver + attribute, FUN = "sum", data = df)
  sender receiver attribute edge
1      1        1        12    0
2      1        2        12    3
3      3        4        13    1
4      5        5        13    0
> require(data.table)
> dt <- data.table(df)
> dt[, list(sumedge = sum(edge)), by = "sender, receiver, attribute"]
     sender receiver attribute sumedge
[1,]      1        1        12       0
[2,]      1        2        12       3
[3,]      3        4        13       1
[4,]      5        5        13       0

Для записи этот вопрос задан много раз, просматривая мои собственные ответы, дает несколько ответов, которые указывают на правильный путь.