Создание функций с логическими сравнениями в качестве входных данных R - PullRequest
0 голосов
/ 05 июня 2018

У меня есть несколько последовательных сравнительных оценок, которые нужно провести с двумя переменными в R, чтобы проверить соответствие.

В этом примере, скажем, у меня есть логическое значение ANES_6 и числовое значение ANES.Логическое значение равно 1, если пациент имел анестезию в течение более 6 часов, еще 0.Числовое значение - это время, когда пациент находился под наркозом.

Я хочу написать функцию, которая может заменить несколько копий следующих копий:

data %>% select(ANES_6, ANES) %>% 
          filter(ANES_6 == 1 & ANES < 6)) %>% 
          tally()

data %>% select(ANES_6, ANES) %>% 
          filter(ANES_6 == 0 & ANES >= 6)) %>% 
          tally()

data %>% select(ANES_6, ANES) %>% 
              filter(ANES_6 == 1 & ANES >= 6)) %>% 
              tally()

data %>% select(ANES_6, ANES) %>% 
              filter(ANES_6 == 0 & ANES >= 6)) %>% 
              tally()

Я мог бы создать следующую функцию (не исчерпывающую во всех случаях, показанных выше):

my_func <- function(x, y) {
 if (x == "gt" & y == 1) {
      data %>% select(ANES_6, AnaestheticTime_hours_) %>% 
           filter(ANES >= 6 & ANES_6 == 1) %>% 
           tally()
 } else if (x == "lt" & y == 0 ) {
      data %>% select(ANES_6, AnaestheticTime_hours_) %>% 
           filter(ANES < 6 & ANES_6 != 1) %>% 
           tally()
 }}

, который принимает x и y в качестве входных данных, при этом значения x равны c ('lt', 'gt'), а y - c (0, 1), чтобы оценить все возможныесостояние.Однако это повлечет за собой написание большего количества кода, а не меньше.

Есть ли способ ввести логические сравнения в функцию, так что работает следующее:

my_func <- function(x, y) {
          data %>% select(ANES_6, ANES) %>% 
               filter(ANES x 6 & ANES_6 == y) 
     }

с заменой x на >=, < и т. Д. Вввод функции.В настоящее время это не работает, есть ли обходные пути?

1 Ответ

0 голосов
/ 05 июня 2018

Попробуйте группировать.Вопрос обычно должен включать воспроизводимые тестовые данные, но я предоставил их на этот раз.

library(dplyr)

data <- data.frame(ANES_6 = c(0, 0, 1, 1), ANES = 5:6) # test data
data %>%
  group_by(ANES_6, ANES >= 6) %>%
  tally %>%
  ungroup

давая:

# A tibble: 4 x 3
  ANES_6 `ANES >= 6`     n
   <dbl> <lgl>       <int>
1     0. FALSE           1
2     0. TRUE            1
3     1. FALSE           1
4     1. TRUE            1
...