dplyr group by:如何为缺失城市添加NA值?
解决办法:补全主数据框中缺失城市的NA值
嘿,这个需求很常见,我来给你两个简单好用的方案,都是基于dplyr生态的工具:
方案一:用left_join关联主数据框的城市列表
这个思路是先按你的逻辑统计符合条件的观测数,再和主数据框的完整城市列表做左连接,自动为缺失的城市填充NA:
假设你的主数据框叫main_df,里面包含所有需要的城市(列名也是city),代码如下:
# 第一步:按你的需求统计符合条件的观测数 count_by_city <- data %>% group_by(city) %>% filter(cond1 == TRUE | cond2 == TRUE) %>% tally() # 第二步:和主数据框的城市列表左连接,补全缺失城市 final_counts <- main_df %>% select(city) %>% # 只提取主数据框的城市列,避免多余列干扰 distinct() %>% # 确保每个城市只出现一次 left_join(count_by_city, by = "city")
这样处理后,final_counts里会包含main_df的所有城市,那些在data里没有符合条件观测的城市,对应的n列就会是NA,完美符合你的要求。如果之后要把这个统计列追加到主数据框,直接用left_join(main_df, final_counts, by = "city")就行。
方案二:用tidyr::complete直接补全缺失城市
如果你已经加载了tidyr(dplyr生态的常用包),可以在统计完成后直接用complete函数补全主数据框的所有城市,更简洁:
library(tidyr) count_by_city <- data %>% group_by(city) %>% filter(cond1 == TRUE | cond2 == TRUE) %>% tally() %>% ungroup() %>% # 先取消分组,避免complete的分组冲突 complete(city = main_df$city) # 指定要补全的完整城市列表
complete会自动把main_df里的所有城市都加入结果,没有统计数据的城市对应的n会被设为NA,一步到位。
两种方法都能实现你的需求,选哪个看你习惯~
内容的提问来源于stack exchange,提问作者Conor
相关产品推荐
相关产品推荐

