如何使用 Dataframe 中的变量创建函数

oknwwptz  于 2023-01-15  发布在  其他
关注(0)|答案(3)|浏览(138)

我确信这个问题有点愚蠢(抱歉)......我正在尝试使用保存在Dataframe中的不同变量创建一个函数。函数如下所示:

mlr_turb <- function(Cond_in, Flow_in, pH_in, pH_out, Turb_in, nm250_i, nm400_i, nm250_o, nm400_o){

     Coag = (+0.032690 + 0.090289*Cond_in + 0.003229*Flow_in - 0.021980*pH_in - 0.037486*pH_out 
             +0.016031*Turb_in  -0.026006*nm250_i +0.093138*nm400_o - 0.397858*nm250_o - 0.109392*nm400_o)/0.167304

    return(Coag)
    }

m4_turb <- mlr_turb(dataset)

问题是当我试图在 Dataframe 中运行我的函数时(变量名相同),它没有检测到我的变量,并显示以下消息:

Error in mlr_turb(dataset) : 
  argument "Flow_in" is missing, with no default

但是,实际上,还有所有的变量。

我想我在函数中遗漏了一些顺序,这些顺序使它有可能从数据集中获取变量。我已经搜索了很多,但我没有找到任何答案...

vvppvyoh

vvppvyoh1#

别问愚蠢的问题!
我想你要找的是do.call,这个函数允许你把值作为参数解包到一个函数中,这是一个非常简单的例子。

# a simple function that takes x, y and z as arguments 
myFun <- function(x, y, z){
  result <- (x + y)/z
  return(result)
}

# a simple data frame with columns x, y and z
myData <- data.frame(x=1:5,
                     y=(1:5)*pi,
                     z=(11:15))

# unpack the values into the function using do.call
do.call('myFun', myData)

输出:

[1] 0.3765084 0.6902654 0.9557522 1.1833122 1.3805309
fcipmucu

fcipmucu2#

在编写R时,您会遇到一个标准问题,它与standard evaluation(SE)vs non standard evaluation(NSE)的问题有关。
我认为使用变量编写函数最方便的方法是使用变量名作为函数的参数。
让我们再举一个μ介子的例子。

# a simple function that takes x, y and z as arguments 
myFun <- function(x, y, z){
  result <- (x + y)/z
  return(result)
}

问题是R应该在哪里找到名称xyz后面的值。在一个函数中,R将首先在函数环境中查找(这里xyz被定义为参数),然后它将查看全局环境,然后它将查看附加的不同包。
myFun中,R需要向量。如果您给予列名,您将遇到错误。如果您要提供列名,会发生什么情况?您必须告诉R您提供的名称应该与 Dataframe 范围内的值关联。例如,您可以执行以下操作:

myFun <- function(df, col1 = "x", col2 = "y", col3 = "z"){
  result <- (df[,col1] + df[,col2])/df[,col3]
  return(result)
}

使用data.table包可以在这方面做得更好,如果您开始编写需要使用 Dataframe 中的变量的函数,我建议您开始查看这个包

ctzwtxfj

ctzwtxfj3#

我喜欢Muon的答案,但是如果data.frame中有列而不是函数中的列,我就不能让它工作。使用with()函数是一个简单的方法,也可以让它工作...

#Code from Muon:
# a simple function that takes x, y and z as arguments 
myFun <- function(x, y, z){
  result <- (x + y)/z
  return(result)
}

# a simple data frame with columns x, y and z
myData <- data.frame(x=1:5,
                     y=(1:5)*pi,
                     z=(11:15), 
                     a=6:10)    #adding a var not used in myFun
    
# unpack the values into the function using do.call
do.call('myFun', myData)
#generates an error for the unused "a" column

#using with() function:
with(myData, myFun(x, y, z))

相关问题