R中使用tidyverse的union_all合并数据后行数少8M是什么原因
行数缺失原因排查
- 列删除操作未生效:你提供的删列代码存在变量名拼写错误:删除拥堵附加费列时,2020年数据表的变量名写为
tax_data_2020,但后续合并调用的是taxi_data_2020,缺漏字母i的问题导致待合并的2020年数据表未被修改,仍保留19列。当传入列数量不匹配的对象时,部分版本union_all会自动按最少列数截断,仅保留列名完全对齐的行,直接导致大量数据丢失。 - 列属性不匹配:即便修正拼写错误保证4个表均为18列,也需要确认所有同名列的字段类型完全一致。例如上车时间字段在2017年为时间类型,2018年为字符类型时,
union_all合并时会丢弃类型无法对齐的行,或因隐式转换失败导致行数减少。 - 包命名冲突:
tidyverse内置的dplyr::union_all会按列名匹配、保留所有输入行,但如果你同时加载了plyr包,plyr::union_all会按列位置匹配,和dplyr版本的逻辑差异极大,极易出现数据丢失。可通过明确指定包名的方式规避冲突,比如调用dplyr::union_all执行合并。 - 前置校验缺失:合并前可先统计4个数据表的行数总和,和合并后的结果做对比。同时可通过
intersect(names(taxi_data_2017), names(taxi_data_2018))这类语句逐一核对4个表的列名完全一致,用lapply(list(taxi_data_2017, taxi_data_2018, taxi_data_2019, taxi_data_2020), str)检查列类型完全匹配,避免因元数据不一致导致数据丢失。
内容的提问来源于stack exchange,提问作者Abe Diaz
相关产品推荐
相关产品推荐

