嵌套分组iris数据集应用箱线图函数提取异常值报错排查
问题排查:分组嵌套后调用自定义箱线图函数报错
object 'Sepal.Length' not found 问题场景
为iris数据集新增colour字段,按colour分组嵌套后,调用自定义箱线图函数bxplt提取异常值时触发错误。
原代码示例
bxplt <- function(DATA, X, Y){ bxp <- boxplot(data = DATA, {{Y}}~{{X}}, outcex=2) cBXP <- bxp[4:5] %>% do.call(cbind.data.frame, bxp) return(xBXP) } upIris <- iris %>% mutate(colour = rep(c('Red', 'Blue', 'Green'), 50)) upIris %>% group_by(colour) %>% nest(.) %>% mutate(extra_data = map(data, ~ .x %>% bxplt(., Species, Sepal.Length)))
报错信息
Error in
mutate():
! Problem while computingextra_data = map(data, ~.x %>% bxplt(., Species, Sepal.Length)).
ℹ The error occurred in group 1: colour = "Blue".
Caused by error:
! object 'Sepal.Length' not found
错误原因
- 函数调用的管道传递错误:在
map的匿名函数中,.x %>% bxplt(., Species, Sepal.Length)的写法导致DATA参数被重复传递(.x和.),使得X参数实际接收的是整个嵌套数据集,而非指定的Species列,进而导致Y参数Sepal.Length无法被正确识别。 - 自定义函数内部的两处错误:
do.call(cbind.data.frame, bxp)参数错误:管道传递的是bxp[4:5],此处应使用.指代管道输入,而非直接用bxplt变量。- 返回值笔误:函数最后返回
xBXP,但实际定义的变量是cBXP。
修正后的代码
# 修正自定义箱线图函数 bxplt <- function(DATA, X, Y){ bxp <- boxplot(data = DATA, {{Y}}~{{X}}, outcex=2, plot = FALSE) # 添加plot=FALSE避免重复绘图 cBXP <- bxp[4:5] %>% do.call(cbind.data.frame, .) # 修正do.call的参数引用 return(cBXP) # 修正返回变量名 } upIris <- iris %>% mutate(colour = rep(c('Red', 'Blue', 'Green'), 50)) # 修正map中的函数调用逻辑,避免参数传递混淆 upIris %>% group_by(colour) %>% nest() %>% mutate(extra_data = map(data, ~ bxplt(.x, Species, Sepal.Length)))
补充说明
- 给
boxplot添加plot = FALSE参数,避免分组处理时重复绘制箱线图,仅返回异常值相关的统计结果。 - 调用
bxplt时直接传递.x作为DATA参数,不再使用管道传递,彻底避免参数混淆问题。
内容的提问来源于stack exchange,提问作者Dollar X
相关产品推荐
相关产品推荐

