如何为数据框中的每个唯一行分配日期范围

时间:2018-11-02 23:04:18

标签: r date dplyr tidyverse

我有一张表,该表可以按年给出一个国家的gpi得分。

我拥有的最终数据帧中的现有数据:

gpi_year gpi_rank   gpi_country      gpi_score
2018        1       Iceland          1.096
2018        2       New Zealand      1.192
2018        3       Austria          1.274
.
.
.

2018        161     South Sudan      3.508
2018        162     Afghanistan      3.585
2018        163     Syria            3.6

但是,我需要为每一行添加一个日期范围。

示例: 我将检查该行是否具有 2018 ,如果是,那么我将从 2018年1月1日至2018年12月31日的每个日期重复该国家/地区的记录(因为是2018年)。即一个国家的365个日期。

类似地,如果该行包含任何国家/地区的 2017 数据,则我需要从 2017年1月1日至31-12-日之间的每个日期重复该国家/地区的记录2017 ,即一个国家/地区有365个日期。

示例:需要类似的输出:

gpi_year  gpi_rank  gpi_country  gpi_score  date
2018        1       Iceland      1.096      01-01-2018
2018        1       Iceland      1.096      02-01-2018
2018        1       Iceland      1.096      03-01-2018
.
.
.
.
2018        1       Iceland     1.096       29-12-2018
2018        1       Iceland     1.096       30-12-2018
2018        1       Iceland     1.096       31-12-2018
2018        2       New Zealand 1.096       01-01-2018
2018        2       New Zealand 1.096       02-01-2018
2018        2       New Zealand 1.096       03-01-2018
.
.
.
.
2018        2       New Zealand 1.096       29-12-2018
2018        2       New Zealand 1.096       30-12-2018
2018        2       New Zealand 1.096       31-12-2018

注意::我的数据有 163 个国家/地区。每个国家/地区的得分分别为 2017 2018 因此,我需要为每个国家/地区分配日期,范围为2017年1月1日至2017年1月31日以及2018年1月1日至2018年1月31日。

1 个答案:

答案 0 :(得分:1)

data.table与人工数据框一起使用:

library(data.table)

df <- data.frame("gpi_year" = 2018, "gpi_rank" = 1, "gpi_country" = "Iceland",
                 "gpi_score" = 1.096)

df <- setDT(df)[, .(gpi_rank = gpi_rank, gpi_country = gpi_country, gpi_score = gpi_score,
      date = seq(as.Date(paste0(gpi_year, "-01-01")),
                        as.Date(paste0(gpi_year, "-12-31")), by = "day"),
      gpi_year = gpi_year), by = 1:nrow(df)][, nrow := NULL]

输出:

     gpi_rank gpi_country gpi_score       date gpi_year
  1:        1     Iceland     1.096 2018-01-01     2018
  2:        1     Iceland     1.096 2018-01-02     2018
  3:        1     Iceland     1.096 2018-01-03     2018
  4:        1     Iceland     1.096 2018-01-04     2018
  5:        1     Iceland     1.096 2018-01-05     2018
 ---                                                   
361:        1     Iceland     1.096 2018-12-27     2018
362:        1     Iceland     1.096 2018-12-28     2018
363:        1     Iceland     1.096 2018-12-29     2018
364:        1     Iceland     1.096 2018-12-30     2018
365:        1     Iceland     1.096 2018-12-31     2018