R语言中计算数据框行和时排除前5列的报错问题咨询
搞定rowSums报错:'x' must be numeric
你遇到的这个报错其实很好理解——rowSums()这个函数只认数值型(numeric/integer)的数据,要是你选中的df1[,-c(1:5)]里混了字符、因子这类非数值的列,它就会罢工给你抛这个错。
先排查问题根源
咱们先确认下第6列及以后的列到底是什么类型,跑这行代码就能看到:
# 查看目标列的类型 sapply(df1[,-c(1:5)], class)
要是输出里出现character、factor这类不是numeric或integer的结果,那就是问题所在了。
给你几个可行的解决方案
方案1:只挑数值列计算行和
最稳妥的办法是先从第6列及以后里筛选出数值型的列,再计算行和,这样不管有没有非数值列都不会出错:
# 筛选数值列并计算行和,drop=FALSE防止只剩一列时变成向量 df1$rowsums <- rowSums( df1[, -c(1:5), drop = FALSE][, sapply(df1[, -c(1:5)], is.numeric)], na.rm = TRUE )
方案2:把可转换的非数值列转成数值再算
如果那些非数值列其实是“长得像数字的字符”(比如本来是数字但被识别成了字符),可以先转成数值再计算:
# 提取目标列并尝试转换类型 df_target <- df1[, -c(1:5)] df_target[] <- lapply(df_target, function(x) { if (is.character(x)) as.numeric(x) else x }) # 计算行和并添加到原数据框 df1$rowsums <- rowSums(df_target, na.rm = TRUE)
⚠️ 提醒下:要是字符列里有字母、特殊符号这类转不成数字的内容,转换后会变成NA,所以na.rm=TRUE一定要加上,不然行和会变成NA。
方案3:从源头解决——导入时指定列类型
如果你的数据本来第6列及以后应该全是数值,那可能是导入时被误识别了。重新导入时可以指定列类型,比如用read.csv的话:
# 假设前5列是字符型,后面全是数值型 df1 <- read.csv( "你的数据文件路径.csv", colClasses = c(rep("character", 5), rep("numeric", length(read.csv("你的数据文件路径.csv")) - 5)) )
这个要根据你实际的列类型调整哈。
试一下上面的方法,应该就能正常生成行和列,同时保留原数据框的前5列啦。
内容的提问来源于stack exchange,提问作者magwabat
相关产品推荐
相关产品推荐

