如何按站点唯一日期统计访问次数,排除捕获类型干扰
按站点+唯一日期统计访问次数问题
需要新增一列,按站点分组统计唯一访问次数,但当前方法因存在new和recapture两种capture_type,会将同一日期的不同记录计为独立访问(例如admin_pond站点2022-05-19的recapture记录被标记为visit_4,实际应统一标记为visit_3)。要求实现同一站点+同一日期的所有记录共享同一个visit编号,不受capture_type影响。
示例数据
data <- structure(list(site = c("admin_pond", "admin_pond", "admin_pond", "admin_pond"), date = structure(c(19123, 19130, 19131, 19131), class = "Date"), n = c(9L, 15L, 11L, 9L), capture_type = c("new", "new", "new", "recapture")), row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))
当前方法的问题
当前代码仅按site分组后用1:n()生成编号,会把同一日期的不同capture_type记录当成独立访问,导致编号错误:
bull_frog_visits <- data %>% group_by(site) %>% mutate(n_visit = 1:n(), n_visit = paste0("visit_", n_visit, sep = "")) head(bull_frog_visits)
解决方案
方法一:使用dense_rank()直接生成编号
利用dense_rank()对组内的date进行排序,相同日期会得到相同的排名,直接生成统一的visit编号:
bull_frog_visits <- data %>% group_by(site) %>% mutate(n_visit = paste0("visit_", dense_rank(date))) # 查看结果 bull_frog_visits
方法二:先构建日期-编号映射表再合并
先提取每个站点的唯一日期并生成编号,再通过关联合并回原数据,逻辑更直观:
# 构建站点-日期的访问编号映射表 visit_map <- data %>% distinct(site, date) %>% group_by(site) %>% mutate(n_visit = paste0("visit_", row_number())) # 合并到原数据 bull_frog_visits <- data %>% left_join(visit_map, by = c("site", "date")) # 查看结果 bull_frog_visits
两种方法都能实现需求:admin_pond站点2022-05-19的两条记录会统一标记为visit_3,同一日期的访问不会因capture_type被拆分。
内容的提问来源于stack exchange,提问作者Eizy
相关产品推荐
相关产品推荐

