Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何构建在R中使用外部定义值和字符串条件的自定义函数_R_Function_Nested_Switch Statement_Apply - Fatal编程技术网

如何构建在R中使用外部定义值和字符串条件的自定义函数

如何构建在R中使用外部定义值和字符串条件的自定义函数,r,function,nested,switch-statement,apply,R,Function,Nested,Switch Statement,Apply,我正在编写一个函数,用于计算单个数值变量(double)。它应该从另一个数据框中获取它的组件,该数据框存储了不同的方程,这些方程被分解成单独的部分(我在这里使用线性回归方程,所以它是关于两个变量/列斜率和截距)。 根据方程式表中存储的一个条件(名称/特定字符串),函数应使用同一行的斜率和截距 计算的实际输入数据来自存储在数字列中的另一个数据帧 背景:每个条件都需要一个不同的方程,并且有太多的方程无法将它们合并到单个函数中 我想功能应该遵循以下基本方案: data_conversion(numer

我正在编写一个函数,用于计算单个数值变量(double)。它应该从另一个数据框中获取它的组件,该数据框存储了不同的方程,这些方程被分解成单独的部分(我在这里使用线性回归方程,所以它是关于两个变量/列斜率和截距)。 根据方程式表中存储的一个条件(名称/特定字符串),函数应使用同一行的斜率和截距

计算的实际输入数据来自存储在数字列中的另一个数据帧

背景:每个条件都需要一个不同的方程,并且有太多的方程无法将它们合并到单个函数中

我想功能应该遵循以下基本方案:

data_conversion(numeric_input_data, "equation_id")
在试图在线找到解决方案后,我尝试了apply、subset、ifelse和switch函数的形式,但并没有成功

最后,我希望有一个简单的方法,尽量避免循环等,如果可能的话

#create dataframe with equation parameters
equation_id <- c("eq_1", "eq_2", "eq_3", "eq_4", "eq_5")
slope <- c(1.1627907, 1.6949153, 1.2658228, 0.9345794, 0.9433962)
intercept <- c(-26.4069767,  -0.4067797, -27.3544304, -21.2336449, -22.9245283)
eq_df <- data.frame(equation_id, slope, intercept) 

#create some test data
group <- c("A", "B", "C", "A")
iso_value_p <- c(14, 12, NA, 13.5)
data_df <- data.frame(group, iso_value_p) 

#function [not working]; using iso_value as input for x
data_conversion <- function (x, choose_equation) {
  switch(choose_equation,
        eq_df[eq_df$equation_id == choose_equation, ] = { 
        res <- eq_df$slope * x + eq_df$intercept 
    }
  )
  return(res)
}
但我并没有设法让代码正常工作——上面的示例只是通过对单个值的“手动”计算组装而成


(注:我是编程和R的初学者,因此请原谅我可能相对不准确的描述或忘记了什么。)

如果环境中存在
eq\u df
,我们可以创建一个函数

data_conversion <- function(x, choose_equation) {
   inds <- eq_df$equation_id %in% choose_equation
   eq_df$slope[inds] * x + eq_df$intercept[inds]
}

data_conversion(14.0, "eq_1")
#[1] -10.12791
data_conversion(14.0, "eq_2")
#[1] 23.32203
data_conversion(iso_value_p , "eq_1")
#[1] -10.12791 -12.45349        NA -10.70930
但是,如果我们在函数中将dataframe
eq_df
作为参数传递,则效果更好

data_conversion <- function(eq_df, x, choose_equation) {
   inds <- eq_df$equation_id %in% choose_equation
   eq_df$slope[inds] * x + eq_df$intercept[inds]
}

data_conversion(eq_df, 14.0, "eq_1")
#[1] -10.12791

数据转换非常好,工作正常!非常感谢你的帮助!对不起,我发了两封信。答案引出了另一个关于如何使用动态和多个字符串作为参数的问题(对于choose_等式):
data_conversion(14.0, c("eq_1", "eq_2"))
#[1] -10.12791  23.32203
data_conversion <- function(eq_df, x, choose_equation) {
   inds <- eq_df$equation_id %in% choose_equation
   eq_df$slope[inds] * x + eq_df$intercept[inds]
}

data_conversion(eq_df, 14.0, "eq_1")
#[1] -10.12791