Таблица модификаций с R: интеллектуальная группировка данных - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть сценарий, когда даже в Excel я не уверен, как это можно автоматизировать, а не сделать вручную.

Моя диаграмма Excel выглядит так:

Country      Customer     Device     Level       DueDate
Germany      Aldi         XYZ        3           12.12.20
Germany      Aldi         ABC        3           08.12.20
Germany      Aldi         ZUI        4           08.12.20
USA          LIDL         XYZ        2           12.12.20
USA          LIDL         ABC        2           12.12.20
Jordan       Netto        XYZ        4           12.12.20
Jordan       Netto        ZUI        3           01.11.20

Я надеюсь, что воссоздаю ситуацию правильно. Моя цель - суммировать строки, в которых Country и Customer идентичны и различаются только в свойствах Device. Они должны быть сгруппированы в одну строку / элемент путем создания дополнительной строки (или замены существующей?) Со следующими условиями:

  • в столбце Device список всех упомянутых устройств, разделенных ; или аналогично
  • для Level выберите максимальное значение
  • для DueDate выберите минимальное значение

Так, например, группировка трех начальных элементов в один может иметь формат:

Country          Customer         Device          Level          DueDate
Germany          Aldi          XYZ;ABC;ZUI        4              08.12.20  <--- NEW
USA              LIDL             XYZ             2              12.12.20
USA              LIDL             ABC             2              12.12.20
Jordan           Netto            XYZ             4              12.12.20
Jordan           Netto            ZUI             3              01.11.20

Таким образом, сгруппированные строки заменяются новыми. В настоящее время я знаю, что мне нужно делать, но понятия не имею, как это сделать. Может быть, это также возможно в Excel? Я не знаю какой-либо информации, которая проверяет, содержат ли разные ячейки одно и то же значение, а затем объединяет их, используя шаблон. Может ли это быть легче сделать с помощью R, или это должно быть сделано вручную?

Ответы [ 2 ]

1 голос
/ 06 февраля 2020

Для полноты картины и потому, что ОП, кажется, использует dplyr глаголы в комментарии , здесь также есть решение dplyr:

library(dplyr)
readr::read_table(
  "Country      Customer     Device     Level       DueDate
Germany      Aldi         XYZ        3           12.12.20
Germany      Aldi         ABC        3           08.12.20
Germany      Aldi         ZUI        4           08.12.20
USA          LIDL         XYZ        2           12.12.20
USA          LIDL         ABC        2           12.12.20
Jordan       Netto        XYZ        4           12.12.20
Jordan       Netto        ZUI        3           01.11.20"
) %>% 
  mutate(DueDate = lubridate::dmy(DueDate)) %>% 
  group_by(Country, Customer) %>% 
  summarise(Device = Device %>% unique() %>% toString(),
            Level = max(Level),
            DueDate = min(DueDate))
# A tibble: 3 x 5
# Groups:   Country [3]
  Country Customer Device        Level DueDate   
  <chr>   <chr>    <chr>         <dbl> <date>    
1 Germany Aldi     XYZ, ABC, ZUI     4 2020-12-08
2 Jordan  Netto    XYZ, ZUI          4 2020-11-01
3 USA     LIDL     XYZ, ABC          2 2020-12-12

Обратите внимание, что здесь используется исходный набор данных, опубликованный ОП. Для нахождения минимальной даты требуется преобразовать даты символов в класс Date. Кроме того, toString() используется вместо paste0() для краткости.

1 голос
/ 06 февраля 2020

Работает ли что-то подобное (в R)? При этом используется библиотека data.table, которая отлично подходит для агрегации / группировки следующим образом.

Если вы хотите только уникальные списки устройств, проверьте второй метод:

library(data.table)
dt <- data.table(
  Country = c('G', 'G', 'G', 'U', 'U', 'J', 'J', 'G'),
  Customer = c('A', 'A', 'A', 'B', 'B', 'C', 'C', 'A'),
  Device = c('XYZ', 'ABC', 'ZUI', 'XYZ', 'ABC', 'XYZ', 'ZUI', 'XYZ'),
  Level = c(3, 3, 4, 2, 2, 4, 3, 3),
  Date = as.Date(c('2020-12-12', '2020-12-08', '2020-12-08', '2020-12-12',
                   '2020-12-12', '2020-12-12', '2020-11-01', '2020-12-12'))
)

# All devices (duplicates)
dt[ , 
    .(Device = paste0(Device, collapse = ';'), 
      Level = max(Level), 
      Date = min(Date)), 
    by = .(Country, Customer)]
#   Country Customer          Device Level       Date
#1:       G        A XYZ;ABC;ZUI;XYZ     4 2020-12-08
#2:       U        B         XYZ;ABC     2 2020-12-12
#3:       J        C         XYZ;ZUI     4 2020-11-01

# No duplicate devices - Note the use of unique()
dt[ , 
    .(Device = paste0(unique(Device), collapse = ';'),
      Level = max(Level),
      Date = min(Date)),
    by = .(Country, Customer)]
#   Country Customer      Device Level       Date
#1:       G        A XYZ;ABC;ZUI     4 2020-12-08
#2:       U        B     XYZ;ABC     2 2020-12-12
#3:       J        C     XYZ;ZUI     4 2020-11-01
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...