使用自定义R函数结合mutate across生成新变量时报错求助
问题解决步骤
1. 修正自定义函数percentages
原函数错误地使用了mutate(),而across()会将每一列作为向量传递给自定义函数,mutate()仅适用于数据框,无法处理向量,这是核心报错原因。修正后的函数直接对输入向量执行case_when()判断:
percentages <- function(x) { case_when( x < 25 ~ "Menos 25%", x < 50 ~ "Entre 30% 50%", x < 75 ~ "Entre 50% 75%", x >= 75 ~ "Más 75%" ) }
2. 修正dplyr调用代码
原调用的换行格式可能导致语法歧义,调整为标准链式写法即可:
transp6 <- transp_articles %>% mutate(across(c(perc_index_info_inst_org:perc_index_art_10_portal), percentages))
3. 关于apply调用的错误说明
原apply代码的列选择方式错误,transp_articles$col1:transp_articles$col2不是有效的列索引方式。如果一定要用apply,正确写法如下(但推荐用上面的dplyr方案,更符合tidyverse风格):
# 先提取目标列组成数据框,再用apply处理 target_cols <- transp_articles %>% select(perc_index_info_inst_org:perc_index_art_10_portal) result <- apply(target_cols, margin = 2, percentages) # 若要合并回原数据框: transp6 <- cbind(transp_articles, as.data.frame(result))
额外注意事项
- 确保目标列是数值型(
numeric),如果是字符型需要先转换:mutate(across(目标列, as.numeric)),否则case_when的数值比较会报错。 case_when的条件是按顺序判断的,当前条件满足后不会再执行后续条件,原函数的逻辑是正确的(比如x<25先判断,剩下的x都是>=25的,再判断x<50,以此类推)。
内容的提问来源于stack exchange,提问作者FrancoBattiato
相关产品推荐
相关产品推荐

