Как исправить это утверждение `group_by` - PullRequest
0 голосов
/ 03 мая 2019

У меня возникла проблема с простой цепочкой dplyr, group_by и summarise.

У меня выпал 542 процедуры для разных диагнозов.Вот два выбранных столбца:

> data %>% select(Diagnosis, Split)
# A tibble: 542 x 2
   Diagnosis Split
       <dbl> <dbl>
 1         5     4
 2         3     3
 3         1     1
 4         1     1
 5         3     3
 6         1     1
 7         1     1
 8         2     2
 9         7     4
10         1     1
# … with 532 more rows

Я хочу обобщить данные, чтобы увидеть, сколько процедур было выполнено для каждого диагноза:

> data %>% group_by(Diagnosis) %>% summarise(procedures =n())
# A tibble: 7 x 2
  Diagnosis procedures
      <dbl>      <int>
1         1        262
2         2         91
3         3         63
4         4         36
5         5         37
6         6         31
7         7         22

Но теперь я бы лучше знал названия диагнозовтак как числа не имеют смысла, я создаю «справочную таблицу» вроде:

>diagNames    <- c("1" = "ENT",
+                  "2" = "MND",
+                  "3" = "CVA",
+                  "4" = "INJ",
+                  "5" = "NEU",
+                  "6" = "UNK",
+                  "7" = "OES"
)

Затем я переписываю сгруппированную сводку так:

> data %>%
+      group_by (diagnosis = diagNames[Diagnosis]) %>%
+      summarise(procedures = n())
# A tibble: 7 x 2
  diagnosis procedures
  <chr>          <int>
1 CVA               63
2 ENT              262
3 INJ               36
4 MND               91
5 NEU               37
6 OES               22
7 UNK               31

Пока порядоквыходной сигнал изменился в алфавитном порядке столбца диагностики, фактический выходной результат - именно то, что я хочу, и я мог бы arrange(), если бы захотел.

Теперь у меня есть второй тиббл для другого набора427 процедур, на этот раз я хочу сгруппировать их по полу:

> data %>% select(Sex, Success)
# A tibble: 427 x 2
     Sex Success
   <dbl>   <dbl>
 1     0       1
 2     1       1
 3     0       1
 4     0       1
 5     0       1
 6     0       1
 7     1       0
 8     1       1
 9     1       1
10     1       1
# … with 417 more rows

> data %>%
      group_by (Sex) %>%
      summarise(procedures = n())
# A tibble: 2 x 2
    Sex procedures
  <dbl>      <int>
1     0        157
2     1        270

Опять же, я бы предпочел, чтобы пол был читабельным текстом, а не забываемым числом.Итак, справочная таблица:

> genderNames <- c("0" = "Woman",
+                  "1" = "Man"
+ )

Затем я переписываю сгруппированную сводку, используя почти тот же синтаксис, что и в первом примере:

> data %>%
+     group_by (gender = genderNames[Sex]) %>%
+     summarise(procedures = n())
Error: Column `gender` must be length 427 (the number of rows) or one, not 270

Почемуэто генерирует ошибку, когда первый пример не?

Я пытался устранить неполадки;Единственное отличие, которое я вижу, состоит в том, что «Диагноз» был от 1 до 7, тогда как «Секс» начинается с 0. Конечно, это не проблема?

Есть предложения?Спасибо

1 Ответ

1 голос
/ 03 мая 2019

Как было упомянуто ранее OP, использование индекса 0 нарушает код.

В этом решении используются два пакета из Tidyverse. Вам нужно будет загрузить следующее:

library(tibble)
library(dplyr)

Один из способов исправить это - просто обернуть переменную Sex в as.character ().

data %>%
  group_by(gender = genderNames[as.character(Sex)]) %>%
  summarise(procedures = n())

Альтернативой может быть создание таблицы для использования в качестве справочной таблицы и присоединение к этой таблице.

genderLookup <- tibble(Sex = c(0,1), gender = c('Woman','Man'))

Затем вы можете присоединиться к вновь созданной таблице поиска.

data %>%
  left_join(genderLookup, keep = FALSE) %>%
  group_by(gender) %>%
  summarise(procedures = n())

keep = FALSE удалит присоединяющуюся переменную.

Любой способ работает, но второй более удобен для удобочитаемости и отладки.

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