展开开始日期和结束日期之间的行,并计算R中的天数

问题描述 投票:0回答:1

我有一个数据集,其中的每一行都是部长ID,对于每一行我都有带有日期(天,月和年)的列,部长进入政府(开始)并离开政府(退出)。这是有关当前外观的示例:Original

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)来计算部长在政府任职的天数。数据集中的其他变量(此处省略)仅应在数据的扩展版本中重复)。这是我正在寻找的数据帧输出:Output dataframe

最初,我尝试使用tidyr::gather(),然后使用tidyr::complete()将列收集到键值对中。但这没有用。

r dplyr panel-data tidy
1个回答
0
投票

您正在寻找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
© www.soinside.com 2019 - 2024. All rights reserved.