【问题标题】:using R apply to run a function on specific columns of a dataframe使用 R apply 在数据框的特定列上运行函数
【发布时间】:2013-11-19 21:27:12
【问题描述】:

我有这个函数,它返回给定图形对象 igraph_obj(权重存储在计算)用于节点1和节点2(存储在数据帧df中):

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 的每一行 i。

因此,apply 函数应该如下所示:

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

但是,dweight 不知道将 df 的哪一列用作 node1、node2。这也不起作用:

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

【问题讨论】:

  • 你要么想使用mapply,要么想修改你的函数。

标签: r apply


【解决方案1】:

试试:

  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) 

【讨论】:

  • 第一个 mapply 调用的最后一个参数中的错字:oreArgs 应该是 MoreArgs。
猜你喜欢
  • 2013-09-01
  • 2021-04-05
  • 2012-03-26
  • 2014-01-16
  • 1970-01-01
  • 2015-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多