R语言按日期聚合县级COVID病例为州级数据时匹配失效排查
原函数日期匹配失效原因
你的代码存在4个核心逻辑错误,直接导致匹配逻辑完全无法运行:
- 传参与遍历对象不匹配:调用函数时传入的是完整的县级数据集
county_covid_data(数据框类型),但函数内的for循环是对传入对象做逐元素遍历,实际会遍历数据框的每一列,根本不会按日期维度循环。 - 索引用法完全错误:判断条件里写的
cumulative_cases_df$Dates[x],其中x是日期字符串(比如"2020-01-01"),R中数据框方括号索引默认接收整数行号,传入字符串会直接返回NA,相等判断从第一步就永远不成立。 - 累加逻辑范围错误:就算索引能正常运行,你每次循环也只会取
county_covid_data中对应位置的单个病例值,不会把同一日期下所有县的病例值全部累加。 - 作用域不规范:函数内直接操作全局环境的
cumulative_cases_df和county_covid_data对象,没有通过函数参数传入数据、也没有返回计算结果,很容易出现环境关联的隐性报错。
正确实现方案
不需要手写循环做日期匹配,R原生就支持分组聚合操作,代码更简洁、运行效率更高,也不会出现手动匹配的逻辑错误。以下两种方法都可以直接得到按日期聚合的全州病例数据:
基础R实现(无需安装第三方包)
直接用内置的aggregate函数做分组求和即可,以你给出的示例数据为例:
# 示例县级数据集 data_sample <- data.frame( date = c("2020-01-01", "2020-01-02", "2020-01-03", "2020-01-01", "2020-01-02", "2020-01-03"), cumulative_cases = c(4,6,10,3,5,11) ) # 按日期分组计算全州总病例 state_covid_data <- aggregate( cumulative_cases ~ date, data = data_sample, FUN = sum ) # 重命名列方便识别 colnames(state_covid_data) <- c("date", "state_total_cumulative_cases")
运行后得到的结果完全符合需求:
- 2020-01-01:总病例7(4+3)
- 2020-01-02:总病例11(6+5)
- 2020-01-03:总病例21(10+11)
dplyr实现(代码可读性更高)
如果日常使用tidyverse生态的工具,可以用dplyr的分组语法写,逻辑更直观,还可以自动处理缺失值:
library(dplyr) state_covid_data <- data_sample %>% group_by(date) %>% summarise( state_total_cumulative_cases = sum(cumulative_cases, na.rm = TRUE) ) %>% ungroup()
提示:sum函数中加入na.rm = TRUE参数,可以在原始数据存在病例值缺失的情况下,依然返回正常的累加结果,不会因为单个NA导致整日期的结果为NA
内容的提问来源于stack exchange,提问作者Elijah Huang
相关产品推荐
相关产品推荐

