2012-05-24 57 views
14

我有一個關係數據集,我正在尋找二進制信息。在數據框內合併行

我有4列。發件人,接收器,屬性,邊緣

我期待採取重複的發件人 - 接收器計數並將它們轉換爲額外的邊緣。

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不打算通過發送者+接收者+屬性進行分組,而只是通過「發送者+接收者」和「屬性」進行分組。在這個例子中,'屬性'恰好是'發送者+接收者'配對唯一的,但我認爲*是偶然的 –

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