我正在研究一个用于计算单个数字变量(双精度)的函数。它应从另一个数据框中获取其组成部分,该数据存储有分解成单个部分的不同方程式(我在这里使用线性回归方程式,因此它涉及两个变量/列的斜率和截距)。 还要根据方程式表中存储的一个条件(名称/特定字符串),函数应使用斜率并从同一行截取。
用于计算的实际输入数据来自存储在数字列中的另一个数据框。
背景:每个条件都需要一个不同的方程式,而且太多了,无法将它们组合成一个函数。
我猜该函数应该遵循以下基本方案:
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编程的初学者,所以请原谅我可能不太准确的描述,或者如果忘记了某些内容。)
答案 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