【问题标题】:Passing multiple arguments to a function taken from dataframe将多个参数传递给从数据框中获取的函数
【发布时间】:2017-02-16 18:04:07
【问题描述】:

将尝试简化这一点,以便更容易解释。假设你有一个函数:

testfun = function(jID,kID,d){
  g=paste0(jID,kID)
  date = d
  bb=data.frame(g,date)
  return(bb)
}

和一个数据框:

x=data.frame(jID = c("a","b"),kID=c("c","d"),date="20170206",stringsAsFactors = FALSE)

我想将每一行传递给函数输入:

所以循环1:

testfun(x[1,1],x[1,2],x[1,3]) -> return(bb)

第 2 周期:

testfun(x[2,1],x[2,2],x[2,3]) -> return(bb)

我尝试过使用mapply(testfun, x[,1],x[,2],x[,3]),但我得到了一些总结。

【问题讨论】:

    标签: r function dataframe


    【解决方案1】:

    听起来你只是想关闭简化

    mapply(testfun, x[,1],x[,2],x[,3], SIMPLIFY=FALSE)
    

    你也可以向量化你的函数

    vtestfun <- (Vectorize(testfun, SIMPLIFY=FALSE))
    vtestfun(x[,1],x[,2],x[,3])
    

    【讨论】:

      【解决方案2】:

      这是使用dplyr 的解决方案。 关键是按行分组并为每一行运行你的函数。 该函数的输出应在新数据集中创建新列,位于您使用的值旁边。

       library(dplyr)
      
      testfun = function(jID,kID,d){
        g=paste0(jID,kID)
        date = d
        bb=data.frame(g,date)
        return(bb)
      }
      
      
      x=data.frame(jID = c("a","b"),kID=c("c","d"),date="20170206",stringsAsFactors = FALSE)
      
      
      x %>% do(data.frame(.,                                     # keep row of your dataset
                          testfun(.$jID, .$kID, .$date)))        # run the function using the values of that row
      
      #   jID kID     date  g   date.1
      # 1   a   c 20170206 ac 20170206
      # 2   b   d 20170206 bd 20170206
      

      请注意,该过程会创建一个新列 date.1,因为您的输入之一存在 date

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-04
        • 2016-04-02
        • 1970-01-01
        • 1970-01-01
        • 2020-05-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        相关资源
        最近更新 更多