【问题标题】:apply function for every ith row and use columns as arguments对每一行应用函数并使用列作为参数
【发布时间】:2014-01-29 17:46:02
【问题描述】:

很抱歉,如果以前有人问过这个问题,但找不到我的问题的解决方案。哪个apply-like 函数适合以下情况?

我有一个 R 函数,它有 3 个参数 (x, y, z)。它的作用基本上是调用PostgreSQL 函数,该函数查询x, y, z 并检索由相应值a, b, c 组成的数据帧,类似这样;

myfunc <- function(x, y, z){
  get.df <- fn$sqldf("SELECT * FROM retrieve_meta_data('$x', '$y', '$z')")
# get.df is a dataframe consisting of x number of rows and columns a, b, c
# some dataframe manipulation... 
  return(get.df)
}

我正在寻找的是通过使用具有 x 行和列数 x, y, z 的数据框 (call.df) 来调用此函数。所以apply 每一行的函数并使用列作为参数。

我查看了一系列类似apply 的函数,但到目前为止我都失败了。这可能很容易。

我想像apply(call.df, c(1,2), myfunc) 这样的东西,但这会产生错误;

Error in eval(expr, envir, enclos) : 
argument "y" is missing, with no default

我希望在不提供任何虚拟数据的情况下足够清楚。任何指针将不胜感激,谢谢!

【问题讨论】:

    标签: r apply


    【解决方案1】:

    如果 x、y 和 z 是 df 的前三列,那么这应该有效:

    apply(df,1,function(params)myfunc(params[1],params[2], params[3]))
    

    apply(df,1,FUN) 采用第一个参数df,并将其按行传递给 FUN(因为第二个参数是 1)。所以在function(params) 中,params 是df 的一行。因此,params[1] 是该行的第一列,依此类推。

    【讨论】:

      【解决方案2】:

      如果您的参数属于不同类型,则此版本将起作用,但在这种情况下,它们看起来都是字符或可以被视为字符,因此 apply 可以正常工作。

      sapply(
        split(df, 1:nrow(df)),
        function(x) do.call(myfunc, x)
      )
      

      【讨论】:

      • 啊,是的,当然!很好,有不同的解决方案。大家干杯!
      【解决方案3】:

      如果您提供示例数据以便获得与您的情况相匹配的答案会很有帮助,但听起来您正在寻找mapply,例如,

      do.call(mapply, c(myfunc, call.df[c(x.col, y.col, z.col)]))
      

      【讨论】:

        【解决方案4】:

        只需申请1 即可获得保证金;然后该行作为向量传递给您的函数,您应该能够处理它。例如:

        > apply(iris, 1, function(v) paste(v["Species"], v["Sepal.Width"]))
        [1] "setosa 3.5"     "setosa 3.0"     "setosa 3.2"     "setosa 3.1"
        ...
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-12
          • 1970-01-01
          • 2021-10-25
          • 2014-10-15
          • 2015-08-23
          • 2021-02-03
          相关资源
          最近更新 更多