R 为每第i行应用函数,并使用列作为参数

R 为每第i行应用函数,并使用列作为参数,r,apply,R,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 i

如果以前有人问过这个问题,我很抱歉,但我找不到解决我问题的方法。哪种类似于
的应用功能适合以下情况

我有一个
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、y和z是df的前三列,那么这应该可以工作:

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

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

如果x、y和z是df的前三列,那么这应该可以工作:

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

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

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

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

如果您的参数是不同类型的,则此版本将起作用,不过在本例中,它们看起来都是字符,或者可以被视为字符,因此
apply
可以正常工作

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

只需申请
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"
...

只需申请
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"
...

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

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

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

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

啊,是的,当然!不同的解决方案很好。干杯!啊,是的,当然!不同的解决方案很好。干杯!