使用dplyr进行表连接时如何修改或避免列中出现NA值?
问题解答
问题1:是否存在更优的连接方式从根本上避免statefips缺失?
存在。你遇到的statefips缺失本质原因是b表本身没有statefips字段,两表直接full join后,仅存在于b表的4行数据(对应2020-01-04、2020-01-11两个日期的两个州数据)没有对应statefips值,所以出现缺失。
可以提前给b表补全statefips字段后再做连接,从根源上避免缺失,也不会丢失任何数据,代码如下:
# 先给b表补全statefips字段 b_with_fips <- left_join(b, state_id, by = "statename") # 再做full join,三个公共字段匹配,不会出现statefips缺失 full_join_opt <- full_join(a, b_with_fips, by = c("statename", "date", "statefips")) %>% arrange(date)
该方案是最优解,没有额外后处理步骤,针对你4000+行的表运行效率极高。
问题2:连接完成后能否补全statefips的值?
可以。你之前的修复代码未生效是因为重复列名冲突:第一次join的结果已经有statefips列,和state_id的statefips重名,dplyr自动加了.x、.y后缀区分,你没有合并两个列,所以原来的缺失值还存在。
两种常用修复代码如下:
方案1:用coalesce合并同名字段(最通用)
full_join_raw <- full_join(a, b, by = c("statename", "date")) %>% arrange(date) # 合并两个statefips列,取非缺失值,删除冗余列 full_join_fixed <- full_join_raw %>% left_join(state_id, by = "statename") %>% mutate(statefips = coalesce(statefips.x, statefips.y)) %>% select(-statefips.x, -statefips.y) %>% arrange(date)
方案2:按州分组直接填充(无需额外映射表)
full_join_fixed <- full_join(a, b, by = c("statename", "date")) %>% group_by(statename) %>% # 取同一个州下第一条非空的statefips值填充所有行 mutate(statefips = statefips[!is.na(statefips)][1]) %>% ungroup() %>% arrange(date)
两种方案针对4000+行的表运行都毫无压力,性能完全满足需求。
内容的提问来源于stack exchange,提问作者Tomas R
相关产品推荐
相关产品推荐

