Другой вариант - использовать функцию gather()
из пакета tidyr
.
Эта функция превращает несколько столбцов в одну пару ключ-значение.Необходимо указать фрейм данных, имя нового столбца «ключ», имя нового столбца «значение», а затем указать, какие столбцы собирать.Если (как в этом случае) есть больше столбцов для включения, чем для исключения, вы можете просто указать, какие столбцы следует исключить вместо:
library(tidyr)
gather(data, key = "month_year", value = "months_to_maturity", -(ID:loan_maturity_date))
#> ID start_date loan_maturity_date month_year months_to_maturity
#> 1 1 2016-01-03 2017-01-03 feb13 46
#> 2 1 2011-01-08 2013-01-08 feb13 NA
#> 3 1 2013-02-13 2015-02-13 feb13 23
#> 4 2 2012-02-03 2016-05-03 feb13 38
#> 5 2 2013-05-08 2014-01-09 feb13 10
#> 6 2 2011-03-13 2013-02-18 feb13 0
#> 7 3 2015-07-03 2016-01-08 feb13 34
#> 8 3 2013-01-09 2015-07-08 feb13 28
#> 9 1 2016-01-03 2017-01-03 march13 45
#> 10 1 2011-01-08 2013-01-08 march13 NA
#> 11 1 2013-02-13 2015-02-13 march13 22
#> 12 2 2012-02-03 2016-05-03 march13 37
#> 13 2 2013-05-08 2014-01-09 march13 9
#> 14 2 2011-03-13 2013-02-18 march13 NA
#> 15 3 2015-07-03 2016-01-08 march13 33
#> 16 3 2013-01-09 2015-07-08 march13 27
#> 17 1 2016-01-03 2017-01-03 april13 44
#> 18 1 2011-01-08 2013-01-08 april13 NA
#> 19 1 2013-02-13 2015-02-13 april13 21
#> 20 2 2012-02-03 2016-05-03 april13 36
#> 21 2 2013-05-08 2014-01-09 april13 8
#> 22 2 2011-03-13 2013-02-18 april13 NA
#> 23 3 2015-07-03 2016-01-08 april13 32
#> 24 3 2013-01-09 2015-07-08 april13 26
И данные, используемые для этого:
df <-
data.frame(ID = c(1,1,1,2,2,2,3,3),
start_date = c("2016-01-03",
"2011-01-08",
"2013-02-13",
"2012-02-03",
"2013-05-08",
"2011-03-13",
"2015-07-03",
"2013-01-09"),
loan_maturity_date = c("2017-01-03",
"2013-01-08",
"2015-02-13",
"2016-05-03",
"2014-01-09",
"2013-02-18",
"2016-01-08",
"2015-07-08"),
feb13 = c(46,
NA,
23,
38,
10,
0 ,
34,
28),
march13 = c(45,
NA,
22,
37,
09,
NA,
33,
27),
april13 = c(44,
NA,
21,
36,
08,
NA,
32,
26))