
[英]How to fill missing values grouped on id and based on time period from index date
[英]How to create a variable based on a time period grouped on id number
我有一个 dataframe
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 循环,但我无法让它工作。
您可以让助手 function 在 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 时间戳。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.