【问题标题】:Fill in max by id between two values/date intervals在两个值/日期间隔之间按 id 填写最大值
【发布时间】:2020-06-27 06:49:24
【问题描述】:

我需要 R 脚本方面的帮助。

我有一个如下所示的表格:

> dput(first)
structure(list(Date = structure(c(1438387200, 1441065600, 1456790400, 
1459468800, 1462060800, 1464739200, 1467331200, 1470009600, 1472688000, 
1475280000, 1477958400, 1480550400, 1483228800, 1485907200, 1488326400, 
1491004800, 1493596800, 1464739200, 1467331200, 1470009600, 1472688000, 
1475280000, 1477958400, 1480550400, 1483228800, 1517443200, 1519862400, 
1522540800, 1525132800, 1527811200, 1530403200, 1533081600, 1535760000, 
1538352000, 1541030400), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    ID = c("A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", 
    "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A2", "A2", "A2", 
    "A2", "A2", "A2", "A2", "A2", "A2", "A3", "A3", "A3", "A3", 
    "A3", "A3", "A3", "A3", "A3", "A3"), flag = c(0, 0, 0, 1, 
    0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 
    0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0)), row.names = c(NA, -35L
), class = c("tbl_df", "tbl", "data.frame"))

我需要改变表,例如,如果从上次 flag ==1(每笔贷款)到再次为 1 的时间少于 5 个月,则应将零替换为 1,否则为保持原样。

输出看起来像这样:

> dput(second)
structure(list(Date = structure(c(1438387200, 1441065600, 1456790400, 
1459468800, 1462060800, 1464739200, 1467331200, 1470009600, 1472688000, 
1475280000, 1477958400, 1480550400, 1483228800, 1485907200, 1488326400, 
1491004800, 1493596800, 1464739200, 1467331200, 1470009600, 1472688000, 
1475280000, 1477958400, 1480550400, 1483228800, 1517443200, 1519862400, 
1522540800, 1525132800, 1527811200, 1530403200, 1533081600, 1535760000, 
1538352000, 1541030400), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    ID = c("A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A1", 
    "A1", "A1", "A1", "A1", "A1", "A1", "A1", "A2", "A2", "A2", 
    "A2", "A2", "A2", "A2", "A2", "A2", "A3", "A3", "A3", "A3", 
    "A3", "A3", "A3", "A3", "A3", "A3"), flag = c(0, 0, 0, 1, 
    1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 
    1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0)), row.names = c(NA, -35L
), class = c("tbl_df", "tbl", "data.frame"))

坦率地说,我不知道从哪里开始,我对 R 有点陌生。

【问题讨论】:

  • 我刚刚用dput编辑过,非常感谢!
  • 或许,试试first %>% filter(as.logical(flag)) %>% group_by(ID) %>% group_by(grp = cumsum(interval(lag(Date, default = first(Date)), Date) %/% months(1) > 5), .add = TRUE) %>% complete(Date = seq(first(Date), last(Date), by = '1 month'), fill = list(flag = 1)) %>% ungroup %>% select(-grp) %>% right_join(first, by = c("ID", "Date")) %>% arrange(ID, Date) %>% transmute(flag = coalesce(flag.x, flag.y))
  • 标志的“A2”值是否有错字?即2017-01-01 A2 in first ?
  • 我的意思是,第一个是 0,但我发现第二个是 1
  • 是的,实际上,我认为您的输出是正确的!非常感谢!1

标签: r date max dplyr


【解决方案1】:

我们可以filter从'first'数据中'flag'为1的行,然后按'ID'分组,根据相邻'的月差创建第二组('grp')日期,检查它是否大于 5,执行cumsum(每当“日期”差异大于 5 个月时,它会将组计数增加 1),通过执​​行一系列 ' 扩展具有 complete 的数据集来自firstlast 'Date' by '1 月' 的日期',加入原始数据集并将'标志'列替换为coalesce

library(dplyr)
library(tidyr)
library(lubridate)
first %>% 
     filter(as.logical(flag)) %>% 
     group_by(ID) %>% 
     group_by(grp = cumsum(interval(lag(Date, 
       default = first(Date)), Date) %/% months(1) > 5), .add = TRUE) %>%
     complete(Date = seq(first(Date), last(Date), by = '1 month'), 
           fill = list(flag = 1)) %>% 
     ungroup %>% 
     select(-grp) %>% 
     right_join(first, by = c("ID", "Date")) %>% 
     arrange(ID, Date) %>% 
     transmute(Date, ID, flag = coalesce(flag.x, flag.y)) 

【讨论】:

  • 非常感谢 akrun 的帮助。我会有一个后续问题。如何计算每个月的相对频率? count(flag==1 per ID)/count(zeros per ID) 但仅适用于每个月的新标志==1?谢谢!
猜你喜欢
  • 2019-12-05
  • 2017-06-13
  • 1970-01-01
  • 2015-08-06
  • 2021-05-30
  • 2018-04-30
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
相关资源
最近更新 更多