Объединить строки в кадре данных
У меня есть реляционный набор данных, где я ищу диадическую информацию.
У меня 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
Если связь между дублирующими отправителями-получателями была объединена и количество дубликатов включено в число ребер.
Любой ввод будет действительно оценен.
Спасибо!
Ответы
Ответ 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
Для записи этот вопрос задан много раз, просматривая мои собственные ответы, дает несколько ответов, которые указывают на правильный путь.