长格式标记重捕数据中按个体统计有效观测次数(保留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
相关产品推荐
相关产品推荐

