R语言多列数值区间统计及cut函数'x must be numeric'报错解决
解决R中cut函数报错
'x' must be numeric的方法 报错原因
报错核心是cut函数要求输入的x必须是数值型,但你用stack(tmp1[-1])得到的values列并非数值类型——大概率是原始data.table里的Eng、Chi等列是字符型或因子型,导致堆叠后的数据类型不符合要求。
分步解决方案
1. 确认并转换列类型
先检查目标列的类型:
# 查看除第一列外的所有列类型 sapply(tmp1[-1], class)
如果输出不是numeric,批量把这些列转成数值型:
# 将tmp1中除第一列外的列转为数值型 tmp1[, (colnames(tmp1)[-1]) := lapply(.SD, as.numeric), .SDcols = colnames(tmp1)[-1]]
2. 修正原代码运行
列类型转换完成后,直接运行原代码即可,也可以在cut时显式转换做双重保障:
breaks <- seq(0, 1, 0.2) labels <- paste0(breaks[-length(breaks)], "-", breaks[-1]) transform(stack(tmp1[-1]), values = cut(as.numeric(values), breaks, labels, include.lowest = TRUE)) %>% table()
3. 适配data.table的高效写法
如果处理大数据,推荐用data.table原生的melt函数转长格式后统计,性能更优:
breaks <- seq(0, 1, 0.2) labels <- paste0(breaks[-length(breaks)], "-", breaks[-1]) # 转长格式 tmp1_long <- melt(tmp1, id.vars = colnames(tmp1)[1], variable.name = "Subject", value.name = "Score") # 确保分数为数值型 tmp1_long[, Score := as.numeric(Score)] # 划分区间 tmp1_long[, Score_Group := cut(Score, breaks, labels, include.lowest = TRUE)] # 生成统计表格 table(tmp1_long$Subject, tmp1_long$Score_Group)
内容的提问来源于stack exchange,提问作者Roq
相关产品推荐
相关产品推荐

