имя динамической переменной и множественное условие в функции в r

#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. Независимо от того, что является динамическим, вам нужно передать его как отдельный аргумент. Смотрите обновленный ответ.