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

基于日期循环标记站点访问次数(每3次重置计数)

修正R代码实现站点访问次数1-3循环标记

需求说明:
现有包含site(站点)和date(日期)的数据框,需新增n_visit列:按站点分组后,访问次数标记到第3次时重新从1开始循环,生成visit_1、visit_2、visit_3格式的标记,以此区分每个站点每3次访问的日期窗口。原代码会生成visit_6这类超出3的标记,不符合要求,需修正。

原代码:

data <- raw_data %>%
group_by(site) %>% 
  mutate(n_visit = match(date, unique(date)),
         n_visit = paste0("visit_", n_visit, sep = ""))

示例数据:

raw_data <- structure(list(site = c("tryon_weber", "phelps_pond", "phelps_pond", 
"admin_pond", "wood_lab_pond", "admin_pond", "phelps_pond", "wood_lab_pond", 
"wood_lab_pond", "rv_pond", "rv_pond", "rv_pond", "tuttle_pond", 
"tuttle_pond", "vorisek_pond", "tuttle_pond", "vorisek_pond", 
"vorisek_pond", "rv_pond", "tryon_weber", "tryon_weber", "rv_pond", 
"tryon_weber", "rv_pond"), date = structure(c(19447, 19447, 19452, 
19467, 19480, 19487, 19488, 19492, 19493, 19499, 19500, 19501, 
19506, 19507, 19507, 19508, 19508, 19509, 19513, 19513, 19514, 
19514, 19515, 19515), class = "Date")), class = "data.frame", row.names = c(NA, 
-24L))

修正方案

原代码的问题在于match(date, unique(date))生成的是组内连续的访问序号,没有循环逻辑。我们可以用row_number()获取组内的行号,再通过取余运算实现1-3的循环:

data <- raw_data %>%
  group_by(site) %>% 
  mutate(
    # 生成1-3循环的数字标记
    visit_num = ((row_number() - 1) %% 3) + 1,
    # 转换为要求的字符串格式
    n_visit = paste0("visit_", visit_num)
  ) %>%
  ungroup() # 若后续无需分组,可取消分组

逻辑说明

  • row_number():按date顺序(数据框原有顺序)生成组内的连续序号
  • ((row_number() - 1) %% 3) + 1:将连续序号转换为1-3循环的数字:
    • 序号1 → (0 %%3)+1=1
    • 序号2 → (1 %%3)+1=2
    • 序号3 → (2 %%3)+1=3
    • 序号4 → (3 %%3)+1=1
    • 以此类推,实现循环标记

内容的提问来源于stack exchange,提问作者Eizy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:17:09