Преобразование фрейма данных в R - PullRequest
0 голосов
/ 22 января 2019

Это мой фрейм данных.

    df<-data.frame(
  Brand=c("Brand_1","Brand_2","Brand_3","Brand_4","Brand_4","Brand_1","Brand_4","Brand_4","Brand_1","Brand_2","Brand_3","Brand_2","Brand_3","Brand_4"),
  M=c("2014-6-1","2014-7-1","2014-8-1","2014-9-1","2014-10-1","2014-11-1","2014-12-1","2015-1-1","2014-2-1","2015-3-1","2014-4-1","2014-5-1","2014-6-1","2014-7-1"),
  Price=c(55,55,55,55,58,58,58,58,58,58,59,60,61,62),
  Quantity=c(140,150,NA,NA,NA,200,NA,NA,100,100,NA,NA,NA,100)
    )

df$M<-as.Date(df$M)


   Brand     M         Price  Quantity
------------------------------------------
1 Brand_1 2014-06-01    55      140
2 Brand_1 2014-11-01    58      200
3 Brand_1 2014-12-01    58      100
4 Brand_2 2014-07-01    55      150
5 Brand_2 2015-03-01    58      100
6 Brand_2 2014-05-01    60       NA
7 Brand_3 2014-08-01    55       NA
8 Brand_3 2014-04-01    59       NA
9 Brand_3 2014-06-01    61       NA
10 Brand_4 2014-09-01    55       NA
11 Brand_4 2014-10-01    58       NA
12 Brand_4 2014-12-01    58       NA
13 Brand_4 2015-01-01    58       NA
14 Brand_4 2014-07-01    62      100
-------------------------------------------

Я хочу изменить с помощью dplyr или другого подобного пакета, такого как таблица ниже. И сразу после преобразования я хочу иметь таблицу, подобную таблице ниже, с изменением этих 4 вещей:

  1. Для столбца M я хочу расширить даты между каждыми двумя переменными, например, дата должна расширяться между 2014-06-01 и 2014-11-01, как в таблице ниже (дополнительные 4 переменные: 2014-07-01,2014-08- 01,2014-09-01,2014-10-01)
  2. Для столбца Price я хочу повторить одно и то же значение для цены для каждой записи
  3. Количество столбцов такое же, как в первой таблице, и
  4. Для столбца Количество первое значение Количество 140 следует разделить, как столбец Количество 1, 28 = 140/5

Марка М Цена Количество Количество1

1 Brand_1 2014-06-01    55      140       28
  Brand_1 2014-07-01    55      NA        28
  Brand_1 2014-08-01    55      NA        28
  Brand_1 2014-09-01    55      NA         28
  Brand_1 2014-10-01    55      NA        28
2 Brand_1 2014-11-01    58      200       200
3 Brand_1 2014-12-01    58      100       100
4 Brand_2 2014-07-01    55      150       150

Верхняя таблица является образцом только для Brand_1 и Brand_2 и не включает Brand_3 и Brand_4.

1 Ответ

0 голосов
/ 22 января 2019

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

library(dplyr)
library(tidyr)

Сначала немного очистите data.frame(), преобразовав M в дату и отсортировав по Brand и M. Затем сгруппируйте Brand и используйте tidyr::complete() для заполнения пропущенных месяцев.

df2 <- df %>%
  mutate(M = as.Date(as.character(M))) %>%
  arrange(Brand, M) %>%
  group_by(Brand) %>%
  complete(M = seq.Date(min(M), max(M), by = '1 month'))

Теперь у нас есть несколько простых расчетов. Создайте переменную Grouping, ища значения без количества. Данные уже отсортированы по M. Сгруппируйте это и заполните Price, взяв min() группы, удалив NA. Сделайте что-то подобное для Quantity1, но разделите на n(), размер группы.

df2 %>%
  ungroup() %>%
  mutate(Grouping = cumsum(if_else(is.na(Quantity),FALSE,TRUE))) %>%
  group_by(Grouping) %>%
  mutate(Price = min(Price, na.rm = T)) %>%
  mutate(Quantity1 = min(Quantity, na.rm = T) / n())

# Groups:   Grouping [6]
   Brand   M          Price Quantity Grouping Quantity1
   <fct>   <date>     <dbl>    <dbl>    <int>     <dbl>
 1 Brand_1 2014-02-01    58      100        1      25  
 2 Brand_1 2014-03-01    58       NA        1      25  
 3 Brand_1 2014-04-01    58       NA        1      25  
 4 Brand_1 2014-05-01    58       NA        1      25  
 5 Brand_1 2014-06-01    55      140        2      28  
 6 Brand_1 2014-07-01    55       NA        2      28  
 7 Brand_1 2014-08-01    55       NA        2      28  
 8 Brand_1 2014-09-01    55       NA        2      28  
 9 Brand_1 2014-10-01    55       NA        2      28  
10 Brand_1 2014-11-01    58      200        3      66.7
# ... with 23 more rows

если хотите, вы можете ungroup() в конце и сделать select(-Grouping), чтобы удалить эту переменную.

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