使用apply()处理DataFrame时遭遇‘non-numeric argument to binary operator’错误的求助
使用apply()处理DataFrame时遭遇‘non-numeric argument to binary operator’错误的求助
嗨,我来帮你分析这个问题并搞定它!
你遇到的这个错误,核心原因是apply()函数在按行处理数据框时,会把每一行统一转换成字符型向量——因为你的数据框里有字符类型的type列,R为了保证整行数据类型一致,会把数值型的x和coef_ind也强制转成字符。这样一来,函数里的x和coef就变成了字符串,自然没法做x^coef这种数值运算,就抛出了“非数值参数”的错误。
下面给你几种可行的解决方案:
方案一:修改现有函数,手动转换类型
直接在函数里把取到的x和coef_ind转换成数值型,同时把第二个if改成else if让逻辑更严谨:
cal <- function(df){ x = as.numeric(df['x']) type = df['type'] coef = as.numeric(df['coef_ind']) if(type == "power"){ outcome = x^coef } else if(type == "expo"){ outcome = 1 - exp(- coef*x) } return(outcome) } # 现在再运行apply就没问题了 apply(tf, 1, cal)
方案二:用dplyr的rowwise()(更推荐)
如果你的项目里已经在用dplyr,这种逐行处理的方式更直观,还能直接把结果添加到原数据框里,而且不会有类型转换的困扰:
library(dplyr) # 用ifelse实现 tf <- tf %>% rowwise() %>% mutate(outcome = ifelse(type == "power", x^coef_ind, 1 - exp(-coef_ind*x))) # 或者用case_when,多类型场景下更清晰 tf <- tf %>% rowwise() %>% mutate(outcome = case_when( type == "power" ~ x^coef_ind, type == "expo" ~ 1 - exp(-coef_ind*x) ))
方案三:用mapply按列传递参数
mapply可以直接把各列作为独立参数传递给函数,避开行类型转换的问题:
# 定义函数,参数直接对应各列 calc_outcome <- function(x, coef, type) { if(type == "power"){ x^coef } else { 1 - exp(-coef*x) } } # 调用mapply计算结果 outcome <- mapply(calc_outcome, tf$x, tf$coef_ind, tf$type) # 把结果加到原数据框 tf$outcome <- outcome
你可以根据自己的使用习惯选择合适的方法,个人更推荐方案二,代码可读性和扩展性都更好~
备注:内容来源于stack exchange,提问作者Wu Jilong
相关产品推荐
相关产品推荐

