【问题标题】:Datafram format transforming in R: how to with dates to years (each ID new row per year)R中的数据框格式转换:如何将日期转换为年份(每年每个ID新行)
【发布时间】:2020-08-13 11:34:27
【问题描述】:

我必须将我的数据框从当前格式转换为新格式(参见下面的图像或结构)。我不知道我怎么能做到这一点。我想要从 2013 年到 2018 年的每个 ID 的一年(所以每个 ID 有 6 行,每年一个)。日期是居住在该地址的日期(进入日期)和离开该地址的日期(结束日期)。所以每个 ID 和年份都会给出他们居住的邮政编码和城市。 ID居住的地方(每年)应该是他们当年居住时间最长的地方。如果他们仍然住在那里,我已经将结束日期设置为 31-12-2018(此处显示为 NA)。下面是一张图片和前 3 行。希望大家能帮帮我!

当前格式:

  • ID (1, 1, 2)
  • 邮政编码(1234AB、5678CD、9012EF)
  • 城市(纽约、洛杉矶、迈阿密)
  • ENTRY_DATE(2014 年 2 月 1 日、2017 年 13 月 3 日、2011 年 10 月 11 日)
  • END_DATE(2017 年 13 月 5 日、2018 年 21 月 12 日、2017 年 6 月 9 日)

新格式:

  • ID (1, 1, 1, 1, 1, 1, 2)
  • 年份(2013、2014、2015、2016、2017、2018、2013)
  • 邮政编码(NA、1234AB、1234AB、1234AB、5678CD、5678CD、9012EF)
  • 城市(北美、纽约、纽约、纽约、洛杉矶、洛杉矶、迈阿密)

    See link below

【问题讨论】:

  • 您能解释一下如何为ZIPCODECITY 分配值吗?通常共享数据的更好方法是使用`dput.了解如何提供reproducible example

标签: r dataframe date time


【解决方案1】:

这是一种方法。

首先,为每个位置创建从开始日期到结束日期的日期间隔。使用 map2unnest 您将为每年创建额外的行。

由于您希望包含该日历年天数最多的位置信息,您可以查看两个间隔之间的重叠:一个间隔是日历年,第二个间隔是 ENTRY_DATEEND_DATE。对于每一年,您可以通过filtermax(WEEKS)(或确保每年一个地址,按WEEKS 和slice(1) 降序排列——或者最新的tidyr 考虑slice_max)。这将保留间隔之间持续时间重叠最多的行。

最终的complete 将确保您拥有 2013-2018 年间所有年份的行。

library(tidyverse)
library(lubridate)

df %>%
  mutate(ENTRY_END_INT = interval(ENTRY_DATE, END_DATE),
         YEAR = map2(year(ENTRY_DATE), year(END_DATE), seq)) %>%
  unnest(YEAR) %>%
  mutate(YEAR_INT = interval(as.Date(paste0(YEAR, '-01-01')), as.Date(paste0(YEAR, '-12-31'))),
         WEEKS = as.duration(intersect(ENTRY_END_INT, YEAR_INT))) %>%
  group_by(ID, YEAR) %>%
  arrange(desc(WEEKS)) %>%
  slice(1) %>%
  group_by(ID) %>%
  complete(YEAR = seq(2013, 2018, 1)) %>%
  arrange(ID, YEAR) %>%
  select(-c(ENTRY_DATE, END_DATE, ENTRY_END_INT, YEAR_INT, WEEKS))

输出

# A tibble: 14 x 4
# Groups:   ID [2]
      ID  YEAR ZIPCODE CITY   
   <dbl> <dbl> <chr>   <chr>  
 1     1  2013 NA      NA     
 2     1  2014 1234AB  NEWYORK
 3     1  2015 1234AB  NEWYORK
 4     1  2016 1234AB  NEWYORK
 5     1  2017 5678CD  LA     
 6     1  2018 5678CD  LA     
 7     2  2011 9012EF  MIAMI  
 8     2  2012 9012EF  MIAMI  
 9     2  2013 9012EF  MIAMI  
10     2  2014 9012EF  MIAMI  
11     2  2015 9012EF  MIAMI  
12     2  2016 9012EF  MIAMI  
13     2  2017 9012EF  MIAMI  
14     2  2018 NA      NA    

数据

df <- structure(list(ID = c(1, 1, 2), ZIPCODE = c("1234AB", "5678CD", 
"9012EF"), CITY = c("NEWYORK", "LA", "MIAMI"), ENTRY_DATE = structure(c(16072, 
17238, 15288), class = "Date"), END_DATE = structure(c(17299, 
17896, 17415), class = "Date")), class = "data.frame", row.names = c(NA, 
-3L))

【讨论】:

    猜你喜欢
    • 2016-10-27
    • 2015-04-29
    • 1970-01-01
    • 2021-04-09
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    相关资源
    最近更新 更多