R语言使用dplyr按分组求和遇错误,请求排查原因
解决dplyr分组求和时“sum not meaningful for factors”的错误
这个报错的核心原因其实很直白:你的Trade_value_local列被R识别成了因子(factor)类型,而sum()函数根本没法对因子类型的数据做求和计算——就好比你不能直接把一串文字加起来一样!
为什么test_dplyr数据集能正常运行,trades_test却不行?大概率是因为:
test_dplyr.csv里的amount列全是纯数值,read.csv()自动把它解析成了数值类型;- 而
trades_test.csv的Trade_value_local列里混了非数值内容(比如逗号分隔的千位符、美元符号、文字备注,甚至是格式奇怪的空值),导致read.csv()默认把它当成了因子处理。
下面给你几个实用的解决方案:
方案1:读取数据时直接指定列类型
在read.csv()里用colClasses参数强制把Trade_value_local设置为数值类型,遇到非数值内容会自动转成NA(后续你可以根据情况处理这些NA):
trades_test = read.csv("trades_test.csv", header=TRUE, colClasses = c("Trade_value_local" = "numeric"))
如果不想指定其他列的类型,只针对这一列设置也可以:
trades_test = read.csv("trades_test.csv", header=TRUE, colClasses = c(Trade_value_local = "numeric"))
方案2:已读入数据后转换列类型
如果数据已经读进R里了,可以先把因子转成字符再转成数值(直接转因子会得到水平的编码,不是原始数值):
# 先看看因子里有什么内容,排查非数值字符 levels(trades_test$Trade_value_local) # 转换类型 trades_test$Trade_value_local = as.numeric(as.character(trades_test$Trade_value_local)) # 执行分组求和,记得加na.rm=TRUE忽略转换产生的NA trades_test %>% group_by(Trade_date, Country_code) %>% summarise(a_sum=sum(Trade_value_local, na.rm=TRUE))
小技巧:提前检查数据类型
读入数据后先检查各列的类型,能帮你提前发现这类问题:
# 用base R的str查看结构 str(trades_test) # 或者用dplyr的glimpse更直观 library(dplyr) glimpse(trades_test)
内容的提问来源于stack exchange,提问作者Yi Wen Edwin Ang
相关产品推荐
相关产品推荐

