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

如何实现按蜂群分组、遇新蜂后标记重置的递增相对年龄变量?

解决方案:用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()

针对你原有代码的问题修正

  1. 不要用summarize:它会聚合行数据,而我们需要保留所有观测行,应使用mutate
  2. 列名规范:带空格的列名需用反引号包裹(如\Queen status`),建议统一用下划线命名(如Queen_status`)
  3. 周期划分错误:相对年龄的递增需要基于"蜂后周期"(新蜂后触发新周期),用cumsum标记周期后,再按周期分组生成序号更可靠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 15:54:54