R语言按分组统计数据框列值跨行列变化次数代码排错
错误原因排查
原代码存在两个核心问题,导致统计结果不符合预期:
- 计算相邻值变化时未按
Target分组,直接对全列做滞后运算,会把前一个Target组最后一行值和后一个Target组第一行值的跨组差异误识别为变化点,引入无效计算 - 后续增加了
targ1clicks == 1的过滤条件,把所有「从1变为0」的变化行全部剔除了——这类变化发生后当前行值为0,会被过滤规则排除,比如Target01组内第一次1→0的变化就因此漏算,最终少统计1次。
正确实现方法
直接按分组统计组内相邻值的差异次数即可,不需要额外过滤值为1的行,参考dplyr实现:
library(dplyr) result <- dat %>% group_by(Target) %>% summarise( # 对每个组,计算当前值和前一个值不等的次数,第一行无前置值返回NA,求和时排除 change_freq = sum(targ1clicks != lag(targ1clicks), na.rm = TRUE) )
运行后输出结果完全符合预期:
# A tibble: 2 × 2 Target change_freq <chr> <int> 1 01 2 2 02 1
如果要沿用原代码「先筛选变化行再统计」的思路,修正后代码如下:
library(dplyr) # 按组筛选组内的变化行,排除跨组干扰 change_rows <- dat %>% group_by(Target) %>% filter(targ1clicks != lag(targ1clicks)) %>% ungroup() # 直接分组计数即可,不需要过滤值为1的行 no.accClicks <- as.data.frame(table(change_rows$Target))
内容的提问来源于stack exchange,提问作者milsandhills
相关产品推荐
相关产品推荐

