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

Этот вопрос вытекает из вопросов и ответов, приведенных здесь: Как создать пользовательскую функцию, которая использует внешние значения со строковым условием в R

Замечание относительно комбинации двух уравнений в качестве аргумента вызывает у меня любопытство и поднимает 2 следующих вопроса:

1) Как я могу использовать несколько уравнений на основе другого строкового значения (переменной группировки), которое я добавлю в eq_df? (ожидаемый результат: числовой вектор различной длины для каждой ячейки в data_df $ iso_value_p)

2) Если я также сохраню эту группирующую переменную в data_df, как можно вызвать уравнение (или несколько), которые совпадают с этой группирующей переменной в eq_df? Код следующий:

#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)
#add a broader group variable (e.g. size)
group_of_eq <- c("small", "medium", "medium", "medium", "large")
eq_df <- data.frame(equation_id, slope, intercept, group_of_eq) 

#create some test data
group <- c("A", "B", "C", "A")
iso_value_p <- c(14, 12, NA, 13.5)
#add a broader group variable (e.g. size)
group_broad <- c("medium", "medium", "small", "large")
data_df <- data.frame(group, iso_value_p, group_broad) 

#group_of_eq and group_broad should have spectra of levels that can be matched together

##[not working] (for question 1):
#Provided that eq_df is present in the environment, we can create a function
data_conversion_with_groups <- function(x, choose_group) {
  inds <- eq_df$group_of_eq %in% choose_group
  eq_df$slope[inds] * x + eq_df$intercept[inds]
}

data_conversion_with_groups(iso_value_p, "medium")
#[1]  23.32203 -12.16456        NA  22.47458
#it should return only 2 values (the 1st and 2nd row in data_df); and it gives an error-message:
#1: In eq_df$slope[inds] * x :
#  longer object length is not a multiple of shorter object length
#2: In eq_df$slope[inds] * x + eq_df$intercept[inds] :
#  longer object length is not a multiple of shorter object length

Я ищу следующее:

Для 1): Для data_conversion_with_groups(iso_value_p, "medium") я бы ожидал вектор длиной 3 (используя 2-4 строки в eq_df). В идеале каждый из них должен быть впоследствии закодирован в столбцы.

Для 2): В случае 1-й строки data_df (которая содержит среднее значение в столбце group_broad), я ожидаю того же результата. Разница в том, что здесь группа вызывается автоматически.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...