преобразовать суммарный кадр данных из длинного в широкий (без использования reshape, reshape2, tydr) - PullRequest
0 голосов
/ 04 апреля 2019

Введение: Я работаю в строгой среде, где я не могу больше устанавливать пакеты. У меня есть доступ к dcast (), xtabs (), reshape () из {stats}. У меня нет доступа к пакетам tydr, reshape или reshape2.

Теперь к проблеме: У меня есть сводный фрейм данных с 4 именами столбцов cust_id, merchant_group, sum и max, который выглядит так:

       cust_id merchant_group          sum   max
         <int> <chr>                  <dbl> <dbl>
 1         495 AIRLINE               45493 4950 
 2         495 AUTO RENTAL            3104 1000 
 3         495 CLOTHING STORES       20928 3140 
 4         495 DEPARTMENT STORES      1082  495
 5         495 DRUG STORES             482  165

Я хочу преобразовать его в широкую форму, которая будет выглядеть так:

cust_id AIRLINE AUTO RENTAL CLOTHING STORES DEPARTMENT  STORES DRUG STORES
  495   45493   3104        20928           1082               482  
  495   4950    1000        3140            495                165

Я пробовал такие функции, как:

xtabs(sum~cust_id+merchant_group, data=my.data)

reshape(my.data, idvar = "cust_id", timevar = "merchant_group", direction = "wide")

Но не решает мою проблему. Заранее спасибо за ваше время.

1 Ответ

0 голосов
/ 04 апреля 2019

Если вам нужно использовать stats::reshape(), вы можете

(1) преобразовать данные в более длинный формат, в котором оба значения sum и max находятся в одном столбце:

my.data.longer <- stats::reshape(data = my.data,
                                 idvar = 1:2,
                                 v.names = "value",
                                 timevar = "variable",
                                 times = c("sum", "max"),
                                 varying = 3:4,
                                 direction = "long")

Что выглядит следующим образом (пока не беспокойтесь об именах строк.):

                          cust_id    merchant_group variable value
495.AIRLINE.sum               495           AIRLINE      sum 45493
495.AUTO RENTAL.sum           495       AUTO RENTAL      sum  3104
495.CLOTHING STORES.sum       495   CLOTHING STORES      sum 20928
495.DEPARTMENT STORES.sum     495 DEPARTMENT STORES      sum  1082
495.DRUG STORES.sum           495       DRUG STORES      sum   482
495.AIRLINE.max               495           AIRLINE      max  4950
495.AUTO RENTAL.max           495       AUTO RENTAL      max  1000
495.CLOTHING STORES.max       495   CLOTHING STORES      max  3140
495.DEPARTMENT STORES.max     495 DEPARTMENT STORES      max   495
495.DRUG STORES.max           495       DRUG STORES      max   165

(2) измените более длинные данные в нужный вам широкий формат:

my.data.wide <- stats::reshape(data = my.data.longer,
                               idvar = c("cust_id", "variable"),
                               timevar = "merchant_group",
                               times = as.character(my.data$merchant_group),
                               v.names = "value",
                               direction = "wide")

Что выглядит следующим образом:

                cust_id variable value.AIRLINE value.AUTO RENTAL value.CLOTHING STORES value.DEPARTMENT STORES value.DRUG STORES
495.AIRLINE.sum     495      sum         45493              3104                 20928                    1082               482
495.AIRLINE.max     495      max          4950              1000                  3140                     495               165

(3) Удалить столбец variable, изменить столбец names и сбросить row.names:

my.data.wide$variable <- NULL
names(my.data.wide)[2:ncol(my.data.wide)] <- as.character(my.data$merchant_group)
row.names(my.data.wide) <- NULL
my.data.wide

Результат:

  cust_id AIRLINE AUTO RENTAL CLOTHING STORES DEPARTMENT STORES DRUG STORES
1     495   45493        3104           20928              1082         482
2     495    4950        1000            3140               495         165
...