R语言中cut()函数报错:'x'必须为数值型的求助
问题分析与解决
你的问题出在数值类型转换的赋值方式上,导致第2-10列并没有真正被转换成数值型,所以cut()会报错。
核心原因
你用data[-1] <- data[-1] %>% mutate_all(~as.numeric(as.character(.)))赋值时,若原data是普通data.frame,而dplyr的mutate_all返回的是tibble,直接替换列可能会触发隐式类型转换,导致列类型又变回字符型(表面无报错,但实际转换未生效)。
解决方案
1. 修正数值转换代码(推荐用across,mutate_all已被弃用)
用dplyr的across函数直接更新整个数据框,确保类型正确转换:
library(dplyr) data <- data %>% mutate(across(-1, ~as.numeric(as.character(.))))
2. 验证转换结果
执行完转换后,先检查第2-10列的类型,确认是数值型:
sapply(data[, 2:10], class)
输出应该全是"numeric"。
3. 替换for循环(可选,更简洁的dplyr写法)
不需要用for循环,直接用across完成分组:
data <- data %>% mutate(across(-1, ~cut(., breaks = c(-4, -0.5, 0.5, 4), labels = c("-", "o", "+"))))
如果坚持用for循环,确保转换后的列确实是数值型后,原循环代码就能正常运行。
内容的提问来源于stack exchange,提问作者Pia Budak
相关产品推荐
相关产品推荐

