在dplyr::mutate的if_else()块中调用predict()报错问题解析
问题原因
dplyr::if_else()是向量化的条件函数,它的设计逻辑是处理逐行的判断:
- 当条件是长度为N的逻辑向量时,
true和false分支必须返回长度为N的向量(或可自动循环到N的长度) - 你的代码里,
loess_not_lm == TRUE是一个长度为1的标量条件,但predict()返回的是长度为10的拟合值向量,两者长度不匹配,这就触发了报错。
而单独在mutate()里调用predict()时,mutate()会直接把整个向量作为新列赋值,不需要逐行匹配长度,所以能正常运行。
正确的dplyr写法
既然你的条件是全局的标量(不是逐行变化的),直接在mutate()里用基础R的if()流程控制语句就行——它会根据条件执行对应代码块,返回完整的拟合值向量:
library(tidyverse) set.seed(123) # 固定随机数,方便复现结果 df <- tibble(x = seq(1:10), y = 10*x + rnorm(10,0,2)) loess_model <- loess(y ~ x, data = df, span = 0.75) lm_model <- lm(y ~ x, data = df) loess_not_lm <- TRUE df <- df %>% mutate(yhat = if (loess_not_lm) { predict(loess_model, newdata = pick(x)) } else { predict(lm_model, newdata = pick(x)) })
补充:逐行条件的场景
如果你的判断条件是逐行变化的(比如基于数据中某列的逻辑值),可以用case_when(),但这种场景下你可能需要为每行单独拟合模型,通常不是高效的分析方式。
内容的提问来源于stack exchange,提问作者blnk55
相关产品推荐
相关产品推荐

