基于日期循环标记站点访问次数(每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
相关产品推荐
相关产品推荐

