Как создать пользовательскую функцию, которая использует внешние значения со строковым условием в R - PullRequest
1 голос
/ 03 апреля 2019

Я работаю над функцией для вычисления одной числовой переменной (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)
}

Функция должна работать следующим образом:

#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, поэтому, пожалуйста, прости меня за мое относительно неточное описание или, если что-то забыл.)

1 Ответ

1 голос
/ 03 апреля 2019

Если в среде присутствует 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

Однако, лучше передать в функцию параметр 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...