R语言分组DataFrame中使用glue函数报错的原因与最优解法
问题分析与解决
报错原因
你遇到的报错核心是**dplyr::if_else对输入长度有严格要求**:它要求条件、true分支、false分支的长度必须完全一致。在分组场景下:
n() > 1是每组返回1个逻辑值(比如class="a"组返回TRUE,class="b"组返回FALSE)glue("{class}_{row_number()}")是每组返回和组内行数相同的向量(class="a"组返回2个元素)
两者长度不匹配,触发了if_else的长度校验错误。你的猜测“glue调用了分组内所有值”是正确的,但本质是if_else的严格限制导致的冲突。
最优解决方法
以下几种方法都能保留分组内的行号,且无需提前取消分组:
方法1:使用基础R的ifelse
基础R的ifelse会自动循环长度为1的条件,适配组内元素长度:
library(dplyr) library(glue) df <- data.frame( class = c("a", "a", "b") ) df %>% group_by(class) %>% mutate(class_2 = ifelse(n() > 1, glue("{class}_{row_number()}"), class)) %>% ungroup()
方法2:使用分组内的if语句
在分组后的mutate中,if会基于每组的上下文判断,直接返回对应长度的结果向量:
df %>% group_by(class) %>% mutate(class_2 = if(n() > 1) glue("{class}_{row_number()}") else class) %>% ungroup()
方法3:使用case_when
case_when同样支持分组内的条件逻辑,写法更清晰:
df %>% group_by(class) %>% mutate(class_2 = case_when( n() > 1 ~ glue("{class}_{row_number()}"), TRUE ~ class )) %>% ungroup()
以上三种方法执行后,都会得到正确的结果:
| class | class_2 |
|---|---|
| a | a_1 |
| a | a_2 |
| b | b |
内容的提问来源于stack exchange,提问作者Lenn
相关产品推荐
相关产品推荐

