亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

根據無序的列對聚合數據幀

根據無序的列對聚合數據幀

慕哥9229398 2019-11-02 14:35:53
我有一個看起來像這樣的數據集:     id1  id2   size1   5400 5505      72   5033 5458      13   5452 2873     244   5452 5213      25   5452 4242     266   4823 4823      47   5505 5400     11其中id1和id2是在一個圖形獨特節點,并且size是分配給一個值涉及連接它們的邊緣從 id1 給 id2。該數據集相當大(超過200萬行)。我想這樣做是和大小列,按分組無序節點對的id1和id2。例如,在第一行中,我們有id1=5400和id2=5505。數據框中存在另一行,其中id1=5505和id2=5400。在分組的數據中,這兩行的size列的總和將添加到單行中。因此,換句話說,我想總結我要對(id1,id2)的(無序)集合進行分組的數據。我找到了一種使用apply使用一個自定義函數來檢查整個數據集中的反向列對,但是這樣做的速度非常慢。有誰知道用另一種方式做這件事的方法,也許plyr在基本軟件包中使用某種方法會更有效?
查看完整描述

3 回答

?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

一種方法是與創建額外的列pmax和pmin的id1和id2如下。我將data.table在這里使用解決方案。


require(data.table)

DT <- data.table(DF)

# Following mnel's suggestion, g1, g2 could be used directly in by

# and it could be even shortened by using `id1` and id2` as their names

DT.OUT <- DT[, list(size=sum(size)), 

        by=list(id1 = pmin(id1, id2), id2 = pmax(id1, id2))]

#     id1  id2 size

# 1: 5400 5505   18

# 2: 5033 5458    1

# 3: 5452 2873   24

# 4: 5452 5213    2

# 5: 5452 4242   26

# 6: 4823 4823    4


查看完整回答
反對 回復 2019-11-02
?
慕后森

TA貢獻1802條經驗 獲得超5個贊

替代方法:


R> library(igraph)

R> DF

   id1  id2 size

1 5400 5505    7

2 5033 5458    1

3 5452 2873   24

4 5452 5213    2

5 5452 4242   26

6 4823 4823    4

7 5505 5400   11

R> g  <- graph.data.frame(DF, directed=F)

R> g  <- simplify(g, edge.attr.comb="sum", remove.loops=FALSE)

R> DF <- get.data.frame(g)

R> DF

   id1  id2 size

1 5400 5505   18

2 5033 5458    1

3 5452 2873   24

4 5452 5213    2

5 5452 4242   26

6 4823 4823    4


查看完整回答
反對 回復 2019-11-02
?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

我的aggregate{stats}函數方法:


> df

   id1  id2 size

1 5400 5505    7

2 5033 5458    1

3 5452 2873   24

4 5452 5213    2

5 5452 4242   26

6 4823 4823    4

7 5505 5400   11


> df[1:2] <- t(apply(df[1:2], 1, sort))

> aggregate(size ~ id1 + id2, data=df, FUN=sum)


   id1  id2 size

1 4823 4823    4

2 2873 5452   24

3 4242 5452   26

4 5213 5452    2

5 5033 5458    1

6 5400 5505   18


查看完整回答
反對 回復 2019-11-02
  • 3 回答
  • 0 關注
  • 552 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號