R语言中如何基于条件选择函数传入apply()解决调用报错问题
R语言apply函数动态选择目标函数的解决方法
报错原因
你遇到的报错来自三个错误用法:
- 错误使用
ifelse做单条件分支:ifelse是向量化函数,返回值为向量结构,此处仅需根据单个逻辑值选择函数,直接使用基础if(){...}else{...}分支即可 - 错误使用公式语法
~标记函数:~是R的公式语法,用于定义purrr风格匿名函数或统计模型公式,base R的apply无法识别该类型作为处理函数,直接引用函数名mean/sd即可 - 额外拼写问题:示例代码中的管道符拼写错误,dplyr管道符为
%>%而非%>
正确实现方式
方法1:提前定义选中的函数(可读性最高)
library(dplyr) # 注意不要用Function作为变量名,和R内置关键字重名容易引发冲突 use_mean <- TRUE # 提前根据条件选择函数 selected_fun <- if (use_mean) mean else sd df <- as.data.frame(matrix(1:12, 4)) %>% mutate(Res = apply(as.matrix(.), 1, selected_fun, na.rm = TRUE))
方法2:直接在apply参数内做分支选择
如果不想额外定义变量,可直接把if分支写在FUN参数位置:
library(dplyr) use_mean <- TRUE df <- as.data.frame(matrix(1:12, 4)) %>% mutate(Res = apply(as.matrix(.), 1, FUN = if (use_mean) mean else sd, na.rm = TRUE))
更推荐的dplyr原生行计算写法
如果是dplyr场景下的按行计算,无需转矩阵调用apply,使用rowwise()+c_across()的原生语法更简洁:
library(dplyr) use_mean <- TRUE df <- as.data.frame(matrix(1:12, 4)) %>% rowwise() %>% mutate(Res = if (use_mean) { mean(c_across(everything()), na.rm = TRUE) } else { sd(c_across(everything()), na.rm = TRUE) }) %>% ungroup() # 结束行计算模式,避免后续操作异常
内容的提问来源于stack exchange,提问作者Brian Smith
相关产品推荐
相关产品推荐

