如何用高效方法替换数据框中0值为后续非零值均分结果?
解决方案
可以用tidyverse工具包实现高效的批量替换,核心思路是将连续的0与后续第一个非零值划分为同一组,再将该非零值均分到组内所有行。
代码实现
library(tidyverse) # 原始数据 C1 <- c(3,0,16,4,5,0,0,27,5,3) DF <- data.frame(ID = seq(1,10, by = 1), C1 = C1) # 处理逻辑 DF_processed <- DF %>% # 为非零行分配组ID,零行设为NA mutate(group = ifelse(C1 != 0, row_number(), NA)) %>% # 反向填充组ID,让每个零行归属到后续最近的非零行组 fill(group, .direction = "up") %>% # 按组分组,将组内非零值均分至所有行 group_by(group) %>% mutate(C1 = first(C1[C1 != 0]) / n()) %>% ungroup() %>% select(-group) # 查看结果 DF_processed
结果验证
运行后得到的DF_processed与你期望的DF.sol完全一致:
> DF_processed # A tibble: 10 × 2 ID C1 <dbl> <dbl> 1 1 3 2 2 8 3 3 8 4 4 4 5 5 5 6 6 9 7 7 9 8 8 9 9 9 5 10 10 3
逻辑解释
- 分组标记:先给每个非零行分配唯一的组ID,零行暂时标记为NA;
- 组归属填充:从下往上填充NA,让每一段连续的零行都归属到后续第一个非零行的组中;
- 均分替换:按组计算长度,将组内唯一的非零值除以组长度,替换组内所有行的
C1值。
这种方法无需循环,利用向量化操作和分组计算,处理大数据框时效率也很高。
内容的提问来源于stack exchange,提问作者GrBa
相关产品推荐
相关产品推荐

