如何修正tidyr中complete/fill无法扩展R数据框Bal2列NA的问题?
修正tidyr::fill()处理Bal2列NA序列的问题
你的问题出在fill()未按ID分组处理,导致跨ID的填充逻辑不符合预期。原代码中ID=60的Bal2原本全为NA,fill()没有可填充的有效值,而其他ID的扩展行需要在组内完成填充。
解决方案是先按ID分组,再执行fill(),让每个ID的填充操作独立进行:
library(dplyr) library(tidyr) testDF <- data.frame( ID = c(rep(1,5),rep(50,3),rep(60,3)), Period_1 = c(1:5,1:3,1:3), Period_2 = c("2012-06","2012-07","2012-08","2012-09","2012-10","2013-06","2013-07","2013-08","2012-10","2012-11","2012-12"), Bal1 = c(rep(10,5),21:23,36:34), Bal2 = c(rep(12,8),rep(NA,3)) ) testDF1 <- testDF %>% tidyr::complete(ID, nesting(Period_1)) %>% group_by(ID) %>% # 按ID分组,确保每个组内独立执行填充逻辑 tidyr::fill(Bal1, Bal2, .direction = "down") %>% ungroup() %>% # 取消分组,恢复普通数据框状态 as.data.frame()
效果说明:
- 对于ID=1和ID=50,它们的Bal2有初始有效值,分组后
fill()会将扩展出来的缺失行填充为对应组的Bal2值; - 对于ID=60,组内所有Bal2原本都是NA,
fill()不会修改这些值,保留了你需要用于后续计算的NA; - 所有ID的行数已被
complete()扩展为一致(每个ID对应Period_1=1到5的行)。
内容的提问来源于stack exchange,提问作者Village.Idyot
相关产品推荐
相关产品推荐

