2013-02-28 40 views
1

我有這個函數,它返回一個鏈接上的邊權重(在這種情況下如何使用apply函數不應該需要任何關於igraph庫的知識)圖表給出了節點1和節點2的圖表對象igraph_obj(其中重量計算後存儲的)(其被存儲在數據幀DF):使用R適用於在數據幀的特定列上運行函數

dweight <- function(igraph_obj, node1, node2){ 
    return(E(igraph_obj)[node1 %->% node2]$weight) 
} 

我想在具有這種結構的數據幀應用此功能:

Node1 Node2 other_column1 other_column2 ... 
a  b  1    2  ... 
c  d  3    7  ... 
... 

我已閱讀文檔和教程apply函數以及我迄今爲止嘗試過的方法並沒有將函數dweight應用到每個node1,node2等。如果我必須編寫一個循環來完成它,它會執行如下操作:dweight(igraph_obj = g, df $ Node1 [i],df $ Node2 [i])爲df的每一行。

因此,應用功能應該是這個樣子:

apply(df, 1, dweight, igraph_obj=g) 

但隨後,dweight不知道爲節點1,節點要使用的DF的列。這不起作用或者:

apply(df, 1, dweight, igraph_obj=g, node1 = df$Node1, node2 = df$Node1) 
+0

您要麼使用'mapply'或要修改您的功能。 – 2013-02-28 04:13:48

回答

3

嘗試:

mapply(dweight, node1=df$Node1, node2=df$Node2, MoreArgs=list(igraph_obj=g)) 

這應該工作,但現在我不能測試它。如果沒有,請嘗試:

mapply(function(n1, n2) dweight(igraph_obj=g, n1, n2), df$Node1, df$Node2) 

另外,如果你想稍微修改你的函數:

dweight <- function(nodes, igraph_obj){ 
    node1 <- nodes$Node1 
    node2 <- nodes$Node2 
    return(E(igraph_obj)[node1 %->% node2]$weight) 
} 

然後你可以使用你的應用功能,你第一次嘗試:

apply(df, 1, dweight, igraph_obj=g) 
+0

第一次應急電話最後一個參數中的錯字:oreArgs應該是MoreArgs。 – regetz 2013-02-28 16:09:24

+0

謝謝@regetz的編輯!固定。 – 2013-03-01 05:21:48