Расширение строк в несколько столбцов в R - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь создать сводную таблицу и сталкиваюсь с некоторыми проблемами при получении вывода.Я не зависим от пакетов, я пробовал reshape2, tidry и dplyr, но ничего не получилось.

Мои попытки до сих пор не дали ошибок, мне также удалось собрать данные для удаленияЗаполните и Target в новую переменную с именем «Type» и значением будет «Seats ... но это, похоже, тоже не поможет.

mynewdf = gather(mydf,Type,Seats,c("Fill","Target"))

Код, который я считаюблизок к работе .....

t=dcast(mydf, Date + Type + Month ~ Seats, length, drop=FALSE)

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

Date Month Fill Target Code
1234  Jan  14    15    13B
1234  Feb  12    14    13B
.................
1235  Oct  13    16    13F

Не должно быть дубликатов Дата / Месяц /Код и то, что я хочу отобразить в конечном счете, это Fill and Target (в конечном итоге выполняются некоторые вычисляемые поля, но я перейду этот мост позже).

Мне бы хотелось, чтобы вывод был:

        Jan             Feb        .......   Oct .....    
Date Fill  Target  Fill  Target    ....... Fill Target.... MOS
1234  14    15     12     14       ....................... 13B
1235  ......................................13   16  ..... 13F

Я попытался сгруппировать по месяцам и заполнению, а затем по месяцам и целям, но безуспешно.

1 Ответ

0 голосов
/ 19 сентября 2018

Ответ немного более многословен, чем хотелось бы, но это должно дать вам начало.

Сначала введите фрейм данных, как вы его показали:

library(dplyr); library(tidyr)

mydf <- data.frame(Date = c(1234, 1234, 1235),
                   Month = c('Jan', 'Feb', 'Oct'),
                   Fill = c(14, 12, 13),
                   Target = c(15, 14, 16),
                   Code = c('13B', '13B', '13F'))

Затем начните преобразование данных с tidyr::unite():

> newdf <- mydf %>% 
+     tidyr::unite(Fill_Target, Fill, Target, sep='_')
> newdf
  Date Month Fill_Target Code
1 1234   Jan       14_15  13B
2 1234   Feb       12_14  13B
3 1235   Oct       13_16  13F

Таким образом, вы объединяете переменные Fill и Target в один столбец.После этого вы можете использовать tidyr::spread:

> newdf <- newdf %>% tidyr::spread(Month, Fill_Target)
> newdf
  Date Code   Feb   Jan   Oct
1 1234  13B 12_14 14_15  <NA>
2 1235  13F  <NA>  <NA> 13_16

Итак, здесь у вас есть Дата и Код, а затем ваш Месяц, за которым следуют значения Fill_Target.Затем используйте tidyr::separate(), чтобы разделить их на отдельные столбцы:

> newdf <- newdf %>% 
+     tidyr::separate(Jan, into = c('Jan_Fill', 'Jan_Target')) %>% 
+     tidyr::separate(Feb, into = c('Feb_Fill', 'Feb_Target')) %>% 
+     tidyr::separate(Oct, into = c('Oct_Fill', 'Oct_Target'))
> newdf
  Date Code Feb_Fill Feb_Target Jan_Fill Jan_Target Oct_Fill Oct_Target
1 1234  13B       12         14       14         15     <NA>       <NA>
2 1235  13F     <NA>       <NA>     <NA>       <NA>       13         16

Затем вы можете использовать dplyr::select(), чтобы изменить порядок столбцов

> newdf %>% 
+   select(Date, Jan_Fill, Jan_Target, Feb_Fill, Feb_Target, Oct_Fill, Oct_Target, 
+          Code)
  Date Jan_Fill Jan_Target Feb_Fill Feb_Target Oct_Fill Oct_Target Code
1 1234       14         15       12         14     <NA>       <NA>  13B
2 1235     <NA>       <NA>     <NA>       <NA>       13         16  13F

Теперь я не люблю этот ответпотому что это немного многословно, особенно если учесть, что у вас будет 12 месяцев.Но вам может быть легче / лучше быть немного многословным и продуманным в своем коде, а не путаться с квази-цитатами и пытаться разделить и выбрать месяцы более изящным способом.

Кроме того, я отмечаю, что есть только одна строка заголовка, в отличие от ваших двух строк.К сожалению, если вам нужна вторая строка заголовка, вам придется использовать Python Pandas;R не поддерживает это.

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