dplyr分组统计:为各城市补全年份缺失值的实现方案
补全城市-年份计数组合,填充缺失值为0
我明白你想要的是让每个城市都对应2019和2020两个年份,无数据的计数显示为0(这确实比NA更实用)。这里有个简洁的解决方案,用tidyr包的complete()函数就能轻松实现,先看完整操作:
library(dplyr) library(tidyr) # 你的原始数据 places <- c("London", "London", "London", "Paris", "Paris", "Rennes") years <- c(2019, 2019, 2020, 2019, 2019, 2020) dataset <- data.frame(years, places) # 先按城市和年份统计数量 dataset2 <- dataset %>% count(places, years) # 补全所有城市-年份组合,缺失的计数填0 dataset_full <- dataset2 %>% complete(places, years, fill = list(n = 0)) # 查看最终结果 dataset_full
运行后会得到你想要的输出:
places years n 1 London 2019 2 2 London 2020 1 3 Paris 2019 2 4 Paris 2020 0 5 Rennes 2019 0 6 Rennes 2020 1
方法解释
complete(places, years):这个函数会自动生成places和years所有可能的配对组合,不管原始计数数据里是否存在对应记录。fill = list(n = 0):专门指定对于没有对应计数的组合,把n的值填充为0。如果确实需要NA,删掉这个fill参数即可。
无tidyr的替代方案
要是你不想加载tidyr包,也可以手动生成组合再合并:
# 生成所有城市-年份的可能组合 all_pairs <- expand.grid( places = unique(dataset$places), years = unique(dataset$years) ) # 合并计数数据,将NA替换为0 dataset_full <- all_pairs %>% left_join(dataset2, by = c("places", "years")) %>% mutate(n = replace(n, is.na(n), 0))
这个方法和上面的效果完全一致,只是步骤稍多一些。
内容的提问来源于stack exchange,提问作者Wilcar
相关产品推荐
相关产品推荐

