Ответ немного более многословен, чем хотелось бы, но это должно дать вам начало.
Сначала введите фрейм данных, как вы его показали:
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 не поддерживает это.