如何实现按蜂群分组、遇新蜂后标记重置的递增相对年龄变量?
解决方案:用dplyr计算蜂后实际年龄
核心思路
按蜂群(Colony)分组,基于新蜂后标记事件划分"蜂后周期",在每个周期内计算递增的相对年龄,最后根据规则生成实际年龄:
- 相对年龄:每个周期内从1开始逐月递增,遇新蜂后重置为1
- 实际年龄:新蜂后行直接赋值1,其余行 = 初始年龄 + 相对年龄
完整可运行代码
假设你已拥有包含Colony、month、Queen_status的原始数据框df,且初始年龄数据已知(可直接合并或在代码中指定):
library(dplyr) # 定义各蜂群的初始年龄,可根据实际数据替换或通过left_join合并 initial_age <- tibble( Colony = c(11, 12), Initial_age_of_queen = c(25, 30) ) # 处理数据生成目标列 result_df <- df %>% # 关联初始年龄数据 left_join(initial_age, by = "Colony") %>% # 按蜂群分组,确保月份顺序正确(YY-MM格式直接字符串排序即可) group_by(Colony) %>% arrange(month) %>% # 标记蜂后周期:每次出现新蜂后则开启新周期,用累计求和区分不同周期 mutate(queen_cycle = cumsum(Queen_status == "New queen marked the day of the visite")) %>% # 计算相对年龄:每个周期内从1开始递增 mutate(Relatif_age = row_number(), .by = c(Colony, queen_cycle)) %>% # 计算实际年龄:新蜂后行直接为1,其余行用初始年龄加相对年龄 mutate(Actual_age = case_when( Queen_status == "New queen marked the day of the visite" ~ 1, TRUE ~ Initial_age_of_queen + Relatif_age )) %>% # 移除辅助列,保留目标列 select(-queen_cycle) %>% ungroup()
针对你原有代码的问题修正
- 不要用
summarize:它会聚合行数据,而我们需要保留所有观测行,应使用mutate - 列名规范:带空格的列名需用反引号包裹(如
\Queen status`),建议统一用下划线命名(如Queen_status`) - 周期划分错误:相对年龄的递增需要基于"蜂后周期"(新蜂后触发新周期),用
cumsum标记周期后,再按周期分组生成序号更可靠
内容的提问来源于stack exchange,提问作者user27379946
相关产品推荐
相关产品推荐

