gpt4 book ai didi

r - R : how to with dates to years (each ID new row per year) 中的数据帧格式转换

转载 作者:行者123 更新时间:2023-12-04 10:07:30 27 4
gpt4 key购买 nike

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

当前格式:

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

  • 新格式:
  • 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
  • 最佳答案

    这是一种方法。

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

    由于您希望包含该日历年天数最多的位置信息,您可以查看两个间隔之间的重叠:一个间隔是日历年,第二个间隔是 ENTRY_DATEEND_DATE .对于每一年,您可以 filter来自 max(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))

    关于r - R : how to with dates to years (each ID new row per year) 中的数据帧格式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61500796/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com