按ID分组填充缺失值但不跨组传递的R语言dplyr实现问题
按ID分组填充缺失值(不跨组传递数值)
原始数据
| ID | 日期 | Compensation(薪酬) |
|---|---|---|
| 004 | Jan1 | NA |
| 004 | Jan2 | 55 |
| 004 | Jan6 | NA |
| 010 | Dec12 | NA |
| 010 | Dec14 | NA |
| 010 | Dec15 | 66 |
| 010 | Dec16 | NA |
| 012 | Feb5 | 33 |
| 012 | Feb9 | NA |
| 012 | Feb10 | NA |
| 012 | May2 | 89 |
需求:按ID分组填充Compensation列的缺失值,禁止将前一个ID组的数值传递到下一个组。若某组开头无有效Compensation值,保留NA,不使用上一组数值填充。
当前使用的错误代码
DataWanted <- Data dplyr::group_by("ID", "Date") %>% fill("Compensation", .direction = "down")
当前结果与期望结果对比
| ID | 日期 | 当前得到的Compensation列 | 期望的Compensation列 |
|---|---|---|---|
| 004 | Jan1 | NA | NA |
| 004 | Jan2 | 55 | 55 |
| 004 | Jan6 | 55 | 55 |
| 010 | Dec 12 | 55 | NA |
| 010 | Dec14 | 55 | NA |
| 010 | Dec15 | 66 | 66 |
| 010 | Dec16 | 66 | 66 |
| 012 | Feb5 | 33 | 33 |
| 012 | Feb9 | 33 | 33 |
| 012 | Feb10 | 33 | 33 |
| 012 | May2 | 89 | 89 |
解决方案
你的代码问题在于group_by的用法错误:用字符串作为分组变量会导致分组失效,实际没有按ID分组,因此填充操作跨了ID组。正确做法是直接传入变量名(无需引号),且仅按ID分组。
修改后的代码:
library(dplyr) library(tidyr) DataWanted <- Data %>% group_by(ID) %>% fill(Compensation, .direction = "down") %>% ungroup()
代码说明
group_by(ID):正确按ID列分组,确保填充仅在每个ID组内执行,不会跨组传递数值。fill(Compensation, .direction = "down"):在组内向下填充缺失值,组开头的NA会保留,不会被上一组数值覆盖。ungroup():可选操作,取消分组避免后续操作受分组状态影响。
内容的提问来源于stack exchange,提问作者mustafghan
相关产品推荐
相关产品推荐

