R语言按条件对列求和统计美国各县收支总量报错解决求助
报错原因
dplyr管道语法使用错误:%>%会将左侧的处理结果作为第一个参数传入右侧函数,你在group_by(FIPS)后直接调用sum(),相当于把分组后的整个数据表传入sum(),而sum()仅支持全数值结构的输入,数据表包含非数值列(比如Type、FIPS编码列都是字符型)就会触发该报错。- 统计逻辑错误:你在
sum()内部重新引用了原始全量数据集county2013,完全没有用到分组后的子集,就算不报错也无法得到按FIPS分组的统计结果,只会返回全表符合条件的总金额。 - 筛选逻辑冗余:重复罗列了多个相同的Type编码,不仅可读性差也容易出错。
解决代码
首先确认你已经安装并加载dplyr包,再运行以下代码:
library(dplyr) # 1. 定义支出类Type编码(已去重你罗列的所有编码) expenditure_type <- c( 'B01','B21','B22','B30','B42','B46','B50','B59','B79','B80','B89','B91','B92','B93','B94', 'C21','C30','C42','C46','C50','C79','C80','C89','C91','C92','C93','C94', 'D21','D30','D42','D46','D50','D79','D80','D89','D91','D92','D93','D94', 'T01','T09','T10','T11','T12','T13','T14','T15','T16','T19','T20','T21','T22','T23','T24','T25','T27','T28','T29','T40','T41','T50','T51','T53','T99', 'A01','A03','A09','A10','A12','A16','A18','A21','A36','A44','A45','A50','A56','A59','A60','A61','A80','A81','A87','A89','A90','A91','A92','A93','A94', 'U01','U11','U20','U21','U30','U40','U41','U50','U95','U99', 'X01','X02','X05','X08', 'Y01','Y02','Y04','Y11','Y12','Y51','Y52' ) # 2. 按FIPS分组统计总支出 county_exp <- county2013 %>% filter(Type %in% expenditure_type) %>% group_by(FIPS) %>% summarise(total_expenditures = sum(Flow, na.rm = TRUE)) # 3. 按FIPS分组统计总营收(请将下方revenue_type替换为你对应的营收类Type编码) revenue_type <- c("营收类Type编码1", "营收类Type编码2") county_rev <- county2013 %>% filter(Type %in% revenue_type) %>% group_by(FIPS) %>% summarise(total_revenue = sum(Flow, na.rm = TRUE)) # 4. 合并收支统计结果为同一张表 county_final <- left_join(county_exp, county_rev, by = "FIPS")
注意事项
- 若需要把统计结果合并回原始明细数据表,可执行:
county2013 <- left_join(county2013, county_final, by = "FIPS") - 运行前请确认
Flow列为数值型,若为字符型请先转换:county2013$Flow <- as.numeric(county2013$Flow),转换前可先排查是否有非数值的异常字符。
内容的提问来源于stack exchange,提问作者Gabriela Nagle
相关产品推荐
相关产品推荐

