#r #function
#r #функция
Вопрос:
Я хочу создать функцию с динамическими переменными ( var1, var2, var3 and var4
) и динамическими условиями. Вот пример функции
dta = data.frame(var1 = c(1:8),
var2 = c(rep("AA",4),rep("BB",4)),
var3 = rep(c("C","D"),4),
var4 = c(1,1,0,0,0,0,1,1))
mean(dta$var1[dta$var2 == "AA" amp; dta$var3 == "C" amp; dta$var4 == 1]
- dta$var1[dta$var2 == "AA" amp; dta$var3 == "C" amp; dta$var4 == 0],na.rm = T)
Если я хочу создать такую функцию, как эта
sample_fun = function(dta,var1 = "var1",var2 == "var2,var2_cond = "AA",var3_cond = "C",var4_cond = 1){
mean(dta$var1[dta$var2 == var2_cond amp; dta$var3 == var3_cond amp; dta$var4 == 1]
- dta$var1[dta$var2 == var2_cond amp; dta$var3 == var3_cond amp; dta$var4 == 0],na.rm = T)
}
Как мне это сделать? использование dplyr
меня тоже устраивает.
Меня особенно беспокоит динамика var1
. Как это должны делать все динамические переменные ( var1, var2, var3
и var4
) вместе?
Ответ №1:
Мы можем использовать [[
для извлечения столбца в виде вектора. Также я использую with
, чтобы не писать data$
каждый раз.
sample_fun = function(dta, var = 'var1', var2_var = "var2", var2_cond = "AA", var3_cond = "C"){
with(dta, mean(dta[[var]][dta[[var2_var]] == var2_cond amp;
var3 == var3_cond amp; var4 == 1] -
dta[[var]][dta[[var2_var]] == var2_cond amp; var3 == var3_cond amp;
var4 == 0],na.rm = TRUE))
}
sample_fun(dta)
#[1] -2
sample_fun(dta, 'var4',var2_var = "var2", var2_cond = 'BB', var3_cond = 'D')
#[1] 1
Комментарии:
1. Спасибо за ваши комментарии. Я отредактировал вопросы. На самом деле, меня больше всего беспокоит динамическая переменная var1. Как я могу изменить переменную var1 на другие?
2. Извините, я не понимаю требования. Сможете ли вы привести пару примеров входных данных для вашей функции и показать ожидаемый результат на основе этого?
3. Если я хочу изменить var1 на var5, var6 и т. Д., Скажем, Как мне создать функцию?
4. Извините, что продолжаю вас беспокоить. Если I var2 также является динамическим, как мне это сделать? Заранее благодарю вас
5. Независимо от того, что является динамическим, вам нужно передать его как отдельный аргумент. Смотрите обновленный ответ.