Этот вопрос вытекает из вопросов и ответов, приведенных здесь:
Как создать пользовательскую функцию, которая использует внешние значения со строковым условием в 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), я ожидаю того же результата. Разница в том, что здесь группа вызывается автоматически.