【问题标题】:Look back at previous week for data in R without loops回顾前一周 R 中没有循环的数据
【发布时间】:2022-07-27 00:45:33
【问题描述】:

我在 R 中有以下格式的数据,我需要创建一个涉及回顾前一周的列

Person Duration Date Type
C 10 29/1/22 T
B 14 1/2/22 T
B 12 1/2/22 T
C 34 1/2/22 T
B 45 8/2/22 M
C 11 8/2/22 M

我正在寻找一种避免循环的方法,因为我发现它们在 R 中需要很长时间

基本上我想遍历整个数据表,如果类型是 M,请回顾 M 日期之前的前一周。然后,如果有任何涉及该人的内容添加持续时间。在此示例中,它将创建以下列

Person Duration Date Type Total Dur
C 10 29/1/22 T N/A
B 14 1/2/22 T N/A
B 12 1/2/22 T N/A
C 34 1/2/22 T N/A
B 45 8/2/22 M 26 (adding rows 2 and 3 together)
C 11 8/2/22 M 34 (only row 4 as row 1 is not week before)

我在这里的第一篇文章希望一切都有意义

【问题讨论】:

  • 我会做类似library(dplyr); library(slider); df %>% group_by(Person) %>% mutate(Total_Dur = slide_index_dbl(Duration, Date, sum, .before = 7) 的事情。如果您将日期转换为日期格式(在 R 中为 iso8601 并显示为 2022-01-29),则对日期进行数学运算会更容易。

标签: r loops date


【解决方案1】:

不确定给定整个数据集的解决方案有多通用,但下面计算字段的窗口定义应该能够处理一些潜在的复杂性

library(magrittr)
library(dplyr)
library(lubridate)

person <- c("c", "b", "b", "c", "b", "c")
duration <- c(10, 14, 12, 34, 45, 11)
date <- c("29/1/22", "1/2/22", "1/2/22", "1/2/22", "8/2/22", "8/2/22")
type <- c("T","T","T","T","M","M")

df <- 
  data.frame(person,
           duration,
           date,
           type) %>% 
  mutate(date = dmy(date))

df %>%
  group_by(person) %>%
  mutate(
    MinDate = date[type=="M"] - days(7),
    TotalDur = if_else(type == "M", sum(duration[date >= MinDate & type != "M"]), NA_real_))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多