2012-05-24 2 views
14

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

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

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

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 

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

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

Спасибо!

ответ

6

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 
+0

Я думаю, что OP не собирался группироваться с помощью атрибута 'sender + receiver + ', а просто' sender + receiver', а 'attribute' - для езды. В примере «атрибут» просто оказывается уникальным для спаривания 'sender + receiver', но я * думаю *, что был случайным –

19

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

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

+1

Любой ответ, используя только базовые функции, всегда получает +1 от меня. – CCC

Смежные вопросы