在R语言中为分组数据生成0值周围的观测序列计数
问题描述
现有如下R语言数据集:
id1 <- c(1,1,1,1,2,2,2,2,1,1,1,1) dates <- c("a","a","a","a","b","b","b","b","c","c","c","c") x <- c(NA,0,NA,NA,NA,NA,0,NA,NA,NA,NA,0) df <- data.frame(id1,dates,x)
需求:新增一列,针对每个id1与dates的组合,生成0值周围的观测序列,期望结果如下:
desired_result <- c(-1,0,1,2,-2,-1,0,1,-3,-2,-1,0)
实现方法
方法1:使用dplyr包(代码可读性高)
通过分组操作定位每组中0值的位置,再计算组内每个行号与该位置的差值:
library(dplyr) df <- df %>% group_by(id1, dates) %>% mutate(desired_result = row_number() - which(x == 0)) %>% ungroup()
方法2:使用基础R(无需额外包)
利用ave函数按组处理,逻辑与上述方法一致:
df$desired_result <- ave(seq_len(nrow(df)), df$id1, df$dates, FUN = function(rows) rows - which(df$x[rows] == 0))
两种方法运行后,df$desired_result都会和预期结果完全匹配。
内容的提问来源于stack exchange,提问作者Gabriel Voelcker
相关产品推荐
相关产品推荐

