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

长格式标记重捕数据中按个体统计有效观测次数(保留NA行)

标记重捕数据新增个体观测次数列的解决方案

我有长格式的标记重捕(mark-recapture)数据,希望新增一列ind.obs,统计每个个体在每次观测时已被观测到的次数,同时保留未观测到(length为NA)的行。

示例数据

library(tibble)
dat <- tibble(
  ID = c("A","A","A","A","A","B","B","B","B","B"),
  period = c("Aug.2012","Jun.2013","Aug.2013","Jun.2014","Aug.2014",
             "Aug.2012","Jun.2013","Aug.2013","Jun.2014","Aug.2014"),
  length = c(12,NA,NA,15,19, NA,3,6,10,NA)
)
dat$sample.event <- rep(1:5, dim(dat)[1]/5)

期望输出

需要新增ind.obs列,保留length为NA的行:

ID   period length sample.event ind.obs
1   A Aug.2012     12            1       1
2   A Jun.2013     NA            2      NA
3   A Aug.2013     NA            3      NA
4   A Jun.2014     15            4       2
5   A Aug.2014     19            5       3
6   B Aug.2012     NA            1      NA
7   B Jun.2013      3            2       1
8   B Aug.2013      6            3       2
9   B Jun.2014     10            4       3
10  B Aug.2014     NA            5      NA

解决方法

使用dplyr可以实现需求,无需删除NA行,具体代码如下:

library(dplyr)

dat_processed <- dat %>%
  group_by(ID) %>%
  mutate(ind.obs = ifelse(!is.na(length), cumsum(!is.na(length)), NA)) %>%
  ungroup()

代码逻辑说明

  • group_by(ID):按个体ID分组,确保每个个体的观测次数单独统计
  • cumsum(!is.na(length)):对每组内的length列判断是否非NA,生成布尔值后累加,得到累计观测次数
  • ifelse(...):仅在length非NA的行填充累计次数,NA行保持为NA,完美保留原始数据结构

之前尝试drop_na(length)会删除NA行、sequence(n(na.rm=T))报错的问题,这个方法都能避免。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:54:57