我有一个数据集,其中的每一行都是部长ID,对于每一行我都有带有日期(天,月和年)的列,部长进入政府(开始)并离开政府(退出)。这是有关当前外观的示例:
structure(list(id_min = c("1030015", "1030028"), begin_day = c("29",
"4"), begin_month = c("12", "1"), begin_year = c("2019", "2020"
), exit_day = c("3", "10"), exit_month = c("1", "1"), exit_year = c("2020",
"2020")), row.names = c(NA, -2L), class = c("data.frame"))
我想扩展“开始日期”和“退出日期”之间的行,并创建一个新列(number_days)来计算部长在政府任职的天数。数据集中的其他变量(此处省略)仅应在数据的扩展版本中重复)。这是我正在寻找的数据帧输出:
最初,我尝试使用tidyr::gather()
,然后使用tidyr::complete()
将列收集到键值对中。但这没有用。
您正在寻找uncount
功能:
library(dplyr)
library(lubridate)
data %>%
mutate(number_days =
as.integer(mdy(paste(exit_month,exit_day,exit_year,sep="-")) -
mdy(paste(begin_month,begin_day,begin_year,sep="-")) + 1)) %>%
uncount(as.integer(number_days))
# id_min begin_day begin_month begin_year exit_day exit_month exit_year number_days
#1 1030015 29 12 2019 3 1 2020 6
#1.1 1030015 29 12 2019 3 1 2020 6
#1.2 1030015 29 12 2019 3 1 2020 6
#1.3 1030015 29 12 2019 3 1 2020 6
#1.4 1030015 29 12 2019 3 1 2020 6
#1.5 1030015 29 12 2019 3 1 2020 6
#2 1030028 4 1 2020 10 1 2020 7
#2.1 1030028 4 1 2020 10 1 2020 7
#2.2 1030028 4 1 2020 10 1 2020 7
#2.3 1030028 4 1 2020 10 1 2020 7
#2.4 1030028 4 1 2020 10 1 2020 7
#2.5 1030028 4 1 2020 10 1 2020 7
#2.6 1030028 4 1 2020 10 1 2020 7