Как организовать данные в сводной, используя несколько условий в R - PullRequest
1 голос
/ 06 апреля 2020

У меня есть упомянутый ниже фрейм данных:

DF:

ID      Date                 Status     Remark       Flag        Value     reps_rt
P-1     20/03/2020  19:08:09 SA         1            L           10000     RI
P-1     20/03/2020  19:08:09 SA         1            L           10000     KT
P-1     20/03/2020  19:08:09 SA         1            L           10000     JS
P-2     20/03/2020  20:08:09 SA         2            K           15000
P-3     20/03/2020  21:08:09 SA         2            J           20000     PO
P-4     20/03/2020  20:08:09 SA         2            H           20000     MK
P-4     20/03/2020  20:08:09 SA         2            H           20000     SS
P-4     20/03/2020  20:08:09 SA         2            H           20000     SA
P-5     20/03/2020  17:08:09 RE                      G           8000
P-6     20/03/2020  12:08:09 RE         1                        6000      RF
P-7     20/03/2020  11:08:09 XA         1                        13000
P-8     19/03/2020  19:08:09 SA         1            L           15000     LO
P-9     19/03/2020  11:08:09 SA                      K           10000     JJ
P-10    19/03/2020  10:08:09 SA         2            J           10000     NO

Я хочу получить следующий вывод, используя DF, где столбец Status имеет отличные 3 значения и Remarks также имеет различные 3 значения 1, 2 или [null], столбец Flag имеет различные 6 значений с [null]. Для одного отдельного ID у нас есть несколько записей в столбце reps_rt.

Мне нужно создать следующий фрейм данных, создав 3 группу на основе Value, например 0-15000, 15000-50000.

  • Если для отдельного идентификатора Flag имеет значение, отличное от 0 или [null] / NA, но reps_rt имеет значение 0 или [null] / NA, тогда это будет a.
  • Если для отдельного идентификатора resp_rt имеет значение, отличное от 0 или [null] / NA, но Flag имеет значение 0 или [null] / NA, тогда это будет b
  • Если для отдельного идентификатора оба значения Flag & resp_rt имеют значение, отличное от 0 или [Null] / NA, тогда это будет c
  • Если для отдельного идентификатора оба значения Flag & resp_rt имеет значение 0 или [Null] / NA, это будет d

20/03/2020 0 - 15000 15000 - 50000 Status count percent L K J H G [Null] count percent L K J H G [Null] Total SA 2 2/5 1 1 0 0 0 1 2 0 0 1 1 0 0 4 a 1 1/2 0 1 0 0 0 0 0 0 0 0 0 0 0 1 b 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 c 1 1/2 1 0 0 0 0 0 2 0 0 1 1 0 0 3 d 0 - 0 0 0 0 0 0 0 0 0 0 0 0 0 0 RE 2 2/5 0 0 0 0 1 1 0 0 0 0 0 0 0 2 a 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 b 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 c 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 d 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 XA 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 a 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 b 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 c 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 d 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 Total 5 1 1 0 0 1 3 2 0 0 1 1 0 0 7

Я упомянул требуемый вывод на основе самой последней даты, которая составляет 20 / 03/2020, если датафрейм не имеет самой последней даты согласно startdate, сохраните все значение 0 в выходном фрейме данных. В процентном столбце только для справки будут рассчитаны процентные значения.

1 Ответ

1 голос
/ 07 апреля 2020

Ваш выходной формат больше похож на сводную таблицу Excel или таблицу для отчета, чем на фрейм данных R для анализа. Особенно с итогами строк и столбцов. Однако в R имеется гораздо больше инструментов для работы с аккуратными прямоугольными данными angular, чем для создания сводных таблиц или таблиц отчетов с промежуточными строками. Поэтому вам может быть лучше выбрать другой инструмент (например, Excel), который более естественно создает искомую структуру вывода.

Если вы решили сделать это в R, тогда простой отправной точкой будет mutate , ifelse и summarise что-то вроде следующего:


df %>% mutate(L = ifelse(Flag == "L",1,0),
              K = ifelse(Flag == "K",1,0),
              # etc for Flag) %>%
  mutate(sub_status = NA) %>%
  mutate(sub_status = ifelse(!is.na(Flag) & reps_rt == 0, "a", sub_status),
         sub_status = ifelse(is.na(Flag) & reps_rt != 0, "b", sub_status),
         # etc for sub-status) %>%
  mutate(value_class = ifelse(0 <= Value & Value <= 15000, "0-15000", "15000-50000")) %>%
  group_by(Date, status, sub_status, value_class) %>%
  summarise(L = sum(L),
            K = sum(K),
            # etc
            count = n())

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

...