Упорядочить данные в таблице HTML в R - PullRequest
6 голосов
/ 09 апреля 2020

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

DF (dput):

structure(list(ID = c("P-1", " P-1", 
    "P-1", "P-2", "P-3", "P-4", 
    "P-5", "P-6", "P-7", "P-8"
    ), Date = c("2020-03-16 12:11:33", "2020-03-16 13:16:04", 
    "2020-03-16 06:13:55", "2020-03-16 10:03:43", "2020-03-16 12:37:09", 
    "2020-03-16 06:40:24", "2020-03-16 09:46:45", "2020-03-16 12:07:44", 
    "2020-03-16 14:09:51", "2020-03-16 09:19:23"), Status = c("SA", 
    "SA", "SA", "RE", "RE", "RE", 
    "RE", "XA", "XA", "XA"), Flag2 = c("L", 
    "L","L", NA, "K", "J", NA, NA, "H", "G"), Value = c(5929.81, 
    5929.81, 5929.81, NA, 6969.33, 740.08, NA, NA, 1524.8, NA), Flag2 = c("CL", 
    "CL", "CL", NA, "RY", "", NA, NA, "", NA), Flag3 = c(NA, NA, 
    NA, NA, "RI", "PO", NA, "SS", "DDP", NA)), .Names = c("ID", 
    "Date", "Status", "Flag", "Value", 
    "Flag2", "Flag3"), row.names = c(NA, 10L), class = "data.frame")

Я использую нижеприведенный код:

    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(Flag2) & Flag3 == 0, "a", sub_status),
             sub_status = ifelse(is.na(Flag2) & Flag3 != 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())

, который обеспечивает мне следующий вывод:

    Date         Status  sub_status   value_class G H I J K L NA Count
    2020-03-20   SA      a            0-15000     0 0 0 0 1 1 0  2
    2020-03-20   SA      b            0-15000     0 0 0 0 1 0 0  1
    ................
    ................

Я хочу получить следующий вывод, используя DF, где столбец Status имеет различные 3 значения, а Flag2 имеет либо значения, либо [ноль], либо NA и, наконец, столбец Flag3 имеет 7 различных значений с [null] или NA. Для одного отдельного ID у нас есть несколько записей в столбце Flag3.

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

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

Счет будет отдельной группой к ID. Кроме того, для первого ряда (где начинается Status, то есть SA, RE et c) percentage будет вычислено на Total и ниже процента для sub_status (то есть a, b, c et c) рассчитывается по количеству состояний.

Я хочу расположить вышеупомянутые datafrmae в следующей структуре со столбцами percent и Total в формате таблицы html, которые можно прикрепить в электронное письмо с использованием библиотеки mailR.

Я использую код:

    library(tableHTML)

    html_table<-df %>% tableHTML(rownames = FALSE,
                                      widths = rep(120, 10),
                                      caption = "XYZ (System Date)") %>%
      add_css_caption(css = list(c("font-weight", "border","font-size"),
                                 c("bold", "1px solid black","16px")))%>% 
      add_css_row(css = list(c("background-color"), c("lightblue")), rows = 0:1)%>%
      add_css_caption(css = list(c("background-color"), c("lightblue")))
    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/4     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 в выходном фрейме данных. В процентном столбце только для справки будут рассчитаны процентные значения.

Кроме того, я хочу сохранить структуру stati c. Например, если какой-либо из параметров не представлен в течение дня, структура вывода будет такой же со значением 0.

Например, предположим, что дата 17/03/2020 не имеет строки со статусом SA или sub_status c заполнитель для этого будет присутствовать в выводе со значением 0.

Примечание: Требуемый вывод только для перспективы формата. Числа могут не совпадать с dput df. ​​

...