R语言dplyr搭配ifelse实现数据框分组新增列报错排查
问题背景
需求:对R数据框df新增assign列,按month和level分组赋值,要求保留全部原始行,不做行删减或聚合,赋值规则匹配给定的期望输出。
原代码问题分析
原实现代码:
df <- df %>% dplyr::mutate(level, month, count)%>% dplyr::group_by(month, level) %>% dplyr::summarise(assign = ifelse(df$val %in% c(0,1), "alone", "together"))
运行报错信息:
Error in
mutate_cols(): ! Problem withmutate()input..3. ℹ..3 = count. ✖..3must be a vector, not a function.
具体错误点:
- 语法层面:
mutate()传入了未定义的count对象,此处R将其识别为dplyr内置的计数函数,不符合mutate()要求传入向量的规则,直接触发报错。 - 用法层面:需求是保留所有原始行新增列,应该用
mutate()实现,而summarise()会按分组将多行压缩为单行聚合结果,会丢失原始数据行。 - 逻辑层面:
- 分组计算时使用
df$val会直接调用原始数据框的全量val列,脱离分组作用域,无法按组计算规则 - 原逐行判断
val %in% c(0,1)的逻辑和期望输出不符:从期望结果可推导规则为同组内所有val都属于{0,1}集合时,整组赋值为alone;只要组内存在任意val不在该集合,整组所有行都赋值为together
- 分组计算时使用
正确实现代码
library(dplyr) # 构造原始数据 df <- data.frame(level = rep(c("1","2","3"), each = 5), month = rep(c("J","J","A"), each = 5), val = c(0,0,1,1,0,2,1,1,1,1,4,6,1,0,1)) # 新增assign列 df <- df %>% group_by(month, level) %>% mutate(assign = ifelse(all(val %in% c(0,1)), "alone", "together")) %>% ungroup()
运行结果
执行代码后输出与期望完全一致:
# A tibble: 15 × 4 level month val assign <chr> <chr> <dbl> <chr> 1 1 J 0 alone 2 1 J 0 alone 3 1 J 1 alone 4 1 J 1 alone 5 1 J 0 alone 6 2 J 2 together 7 2 J 1 together 8 2 J 1 together 9 2 J 1 together 10 2 J 1 together 11 3 A 4 together 12 3 A 6 together 13 3 A 1 together 14 3 A 0 together 15 3 A 1 together
内容的提问来源于stack exchange,提问作者Rspacer
相关产品推荐
相关产品推荐

