r - 如何根据 ID 号分组的时间段创建变量

标签 r date

我有一个数据框

idnr <- c(1,1,1,1,1,1,1,2,2,2,2,2,2,2,5,5,5,5,5,6,6,6,6,6,7,7,7,7)
labvalue <- c(100, 80, 75, 70, 50, 60, 55, 200, 180, 165, 160, 150, 170, 175, 300, 280, 260, 250, 255, 400, 380, 360, 350, 355, 500, 480, 460)
labdate <- as.Date(c("2022-01-01", "2022-01-02", "2022-01-03", "2022-01-04", "2022-01-05", "2022-01-06", "2022-01-07", 
                    "2022-01-08", "2022-01-09", "2022-01-10", "2022-01-11", "2022-01-12", "2022-01-13", "2022-01-14", 
                    "2022-01-15", "2022-01-16", "2022-01-17", "2022-01-18", "2022-01-19", "2022-01-20", "2022-01-21", 
                    "2022-01-22", "2022-01-23", "2022-01-24", "2022-01-25", "2022-01-26", "2022-01-27"))

data <- data.frame(idnr, labvalue, labdate)

我想为每个 idnr 创建一个变量,指示唯一 idnr 的实验室值是否在 2 天内下降了 40 或更多。澄清一下,如果唯一的 idnr 的实验室值为 200,我想检查在实验室值 200 的日期之后但 48 小时内是否有任何实验室值等于或小于 160。

如果日期也有时间戳,我希望它能够工作。我知道我可能需要执行一个 for 循环,但我无法让它工作。

最佳答案

您可以创建一个辅助函数来检查每行在 2 天内是否有掉落,然后使用 purrr::map2_lgl() 应用于日期和值,并按 idnr 分组.

library(dplyr)
library(purrr)

has_drop <- function(cur_date, cur_value, all_dates, all_values) {
  days_diff <- as.numeric(all_dates - cur_date, unit = "days")
  vals_2day <- all_values[between(days_diff, 0, 2)]
  any(vals_2day - cur_value <= -40)
}

data %>% 
  group_by(idnr) %>% 
  summarize(
    drop = any(map2_lgl(
      labdate, 
      labvalue, 
      \(d, v) has_drop(d, v, labdate, labvalue)
    ))
  )
# A tibble: 5 × 2
   idnr drop 
  <dbl> <lgl>
1     1 FALSE
2     2 FALSE
3     5 TRUE 
4     6 TRUE 
5     7 TRUE 

要获取 2 天内下降的值的日期,请使用 filter() 而不是 summarize():

data %>% 
  group_by(idnr) %>% 
  filter(map2_lgl(
    labdate, 
    labvalue, 
    \(d, v) has_drop(d, v, labdate, labvalue)
  )) %>%
  ungroup()
# A tibble: 3 × 3
   idnr labvalue labdate   
  <dbl>    <dbl> <date>    
1     5      300 2022-01-15
2     6      400 2022-01-20
3     7      500 2022-01-25

相同的代码应该适用于 POSIXct 时间戳。

关于r - 如何根据 ID 号分组的时间段创建变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75303261/

相关文章:

mysql 过程 - 在第二个查询中使用结果并重新格式化日期

R xgboost - 如何使用本地数据文件?

R:在两列和组中过滤两个 data.frames 中的重复值

r - 查找(并返回)满足(逻辑)测试的列表的第一个元素

php - 从 Android 获取要存储到 php mysql 中的 DatePicker 值

java - 使用 FastDateFormat 的字符串到日期解析异常

r - 为什么在带有 xts/zoo 的 R 中没有 apply.hourly?

r - 如何从逐步回归中提取公式?

php - 如何在php中获取给定日期范围内月份的开始日期和结束日期

java - 如何从 Java 中选定的日期获取整周日期