如果之前已经问过这个问题,我很抱歉,但无法找到问题的解决方案。哪个apply
- 函数符合以下情况?
我有一个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行数和列(call.df)
的数据框x, y, z
来调用此函数。所以apply
每个第i行的函数并使用列作为参数。
我查看了一系列apply
类功能,但到目前为止我都失败了。这可能很容易。
我想象apply(call.df, c(1,2), myfunc)
之类的东西,但这会给出错误;
Error in eval(expr, envir, enclos) :
argument "y" is missing, with no default
我希望在没有提供任何虚拟数据的情况下足够清楚。任何指针都非常感谢,谢谢!
答案 0 :(得分:2)
如果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]
是该行的第一列,等等。
答案 1 :(得分:2)
如果您的参数属于不同类型,此版本将起作用,但在这种情况下看起来它们都是字符或可以这样处理,因此apply
可以正常工作。
sapply(
split(df, 1:nrow(df)),
function(x) do.call(myfunc, x)
)
答案 2 :(得分:2)
如果您提供样本数据以便获得与您的情况相符的答案,这会很有帮助,但听起来您正在寻找mapply
,例如,
do.call(mapply, c(myfunc, call.df[c(x.col, y.col, z.col)]))
答案 3 :(得分:1)
只需申请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"
...