You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 14:54:07