在R中如何新增列判断样本类型近7天是否有采样记录
实现方案
你的初始统计每日采样数的思路是正确的,只需补充缺失日期、做滚动判断即可得到目标结果,完整实现代码如下:
library(dplyr) library(tidyr) library(lubridate) library(slider) # 1. 预处理原始数据:转换日期格式,标记每日是否有采样 df_clean <- df %>% mutate(日期 = ymd(日期)) %>% group_by(样本类型, 日期) %>% summarise(has_sample = 1, .groups = "drop") # 2. 补全所有样本类型+日期的组合 full_date_seq <- seq.Date(min(df_clean$日期), max(df_clean$日期), by = "day") full_df <- crossing(样本类型 = unique(df_clean$样本类型), 日期 = full_date_seq) %>% left_join(df_clean, by = c("样本类型", "日期")) %>% mutate(has_sample = replace_na(has_sample, 0)) # 3. 分组滚动计算近7天采样状态 result <- full_df %>% group_by(样本类型) %>% arrange(日期) %>% mutate( # 统计当前日期往前推6天(共7天)的总采样次数 week_sample_cnt = slide_dbl(has_sample, sum, .before = 6, .complete = FALSE), 近7天是否采样 = ifelse(week_sample_cnt > 0, "yes", "no") ) %>% ungroup() %>% select(样本类型, 日期, 近7天是否采样)
如果不想额外安装slider包,也可以用基础语法实现滚动计算,替换第三步代码即可:
result <- full_df %>% group_by(样本类型) %>% arrange(日期) %>% mutate( week_sample_cnt = sapply(1:n(), function(i) sum(has_sample[max(1, i-6):i])), 近7天是否采样 = ifelse(week_sample_cnt > 0, "yes", "no") ) %>% ungroup() %>% select(样本类型, 日期, 近7天是否采样)
输出的result对象和你提供的预期结果完全一致,如果你的原始数据列名是英文的sample、date,对应替换代码中的中文列名即可。
内容的提问来源于stack exchange,提问作者code_rookie
相关产品推荐
相关产品推荐

