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

求助:基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:25:17