如何使用R

时间:2019-04-03 01:22:41

标签: r function nested switch-statement apply

我正在研究一个用于计算单个数字变量(双精度)的函数。它应从另一个数据框中获取其组成部分,该数据存储有分解成单个部分的不同方程式(我在这里使用线性回归方程式,因此它涉及两个变量/列的斜率和截距)。 还要根据方程式表中存储的一个条件(名称/特定字符串),函数应使用斜率并从同一行截取。

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

背景:每个条件都需要一个不同的方程式,而且太多了,无法将它们组合成一个函数。

我猜该函数应该遵循以下基本方案:

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)
}

该功能应以这种方式工作:

#for the first data row and the first equation
data_conversion(14.0, "eq_1")

#which should go like
1.1627907 * 14.0 + (- 26.4069767)

#result:
[1] -10.12791

#if I choose the second equation: 
data_conversion(14.0, "eq_2")

#which should go like
1.6949153 * 14.0  + (-0.4067797)

#should give:
[1] 23.32203

####and using the whole dataset togehter with "eq_1" should give:
data_conversion(iso_value_p , "eq_1")
[1] -10.127907  -12.45349  NA  -10.709302

但是我没有设法使代码正常工作-上面的示例只是根据对单个值的“手动”计算得出的。

(PS:我是R和R编程的初学者,所以请原谅我可能不太准确的描述,或者如果忘记了某些内容。)

1 个答案:

答案 0 :(得分:1)

假设环境中存在eq_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

如果同时传递两个方程,这也将起作用。从上面组合1)和2)

data_conversion(14.0, c("eq_1", "eq_2"))
#[1] -10.12791  23.32203

但是,最好将函数中的数据帧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