求助:基于font_name与font_size生成group_var分组向量的错误排查
问题排查:分组变量生成不符合预期
数据集
text font_name font_size <chr> <chr> <dbl> 1 POND_RETRAITE BAAAAA+Arial-BoldMT 12 2 Pondération BAAAAA+Arial-BoldMT 10 3 transversale BAAAAA+Arial-BoldMT 10 4 finale BAAAAA+Arial-BoldMT 10 5 du BAAAAA+Arial-BoldMT 10 6 ménage BAAAAA+Arial-BoldMT 10
需求
生成长度为nrow(data)的group_var向量,分组规则:
- 首行单独成组
- 后续观测值只要
font_name或font_size任一变化,分组编号改变;否则保持同一组
预期输出:
[1] 1 2 2 2 2 2
尝试的代码与错误输出
尝试代码:
group_var <- cumsum(c(TRUE, diff(data$font_size != lag(data$font_size, default = data$font_size[1])) != 0 | diff(data$font_name != lag(data$font_name, default = data$font_name[1])) != 0))
错误输出:
print(group_var) [1] 1 2 3 3 3 3
问题根源
代码逻辑冗余且偏离需求:你先判断每行与首行是否不同,再对这个布尔结果做diff运算。第二行到第三行时,font_size保持10不变,“与首行不同”的结果从TRUE变为FALSE,diff返回TRUE,触发cumsum加1,导致分组编号跳到3,完全违背了“与前一行比较”的核心逻辑。
正确解法
核心逻辑是逐行与前一行比较,只要font_name或font_size任一变化就开启新分组,首行默认开启第一个分组,最后用cumsum累加布尔值得到分组编号。
基础R写法
# 直接比较当前行与前一行的变量 group_var <- cumsum(c(TRUE, data$font_size[-1] != lag(data$font_size)[-1] | data$font_name[-1] != lag(data$font_name)[-1]))
更简洁的基础R写法
利用duplicated判断是否与前一行(按指定变量)重复:
group_var <- cumsum(c(TRUE, !duplicated(data[, c("font_name", "font_size")])[-1]))
tidyverse(dplyr)写法
如果使用dplyr工具链,代码更直观:
library(dplyr) data <- data %>% mutate(group_var = cumsum(c(TRUE, font_size != lag(font_size) | font_name != lag(font_name))))
运行以上任一代码,均可得到预期的group_var结果:[1] 1 2 2 2 2 2
内容的提问来源于stack exchange,提问作者astrori
相关产品推荐
相关产品推荐

