You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用高效方法替换数据框中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

逻辑解释

  1. 分组标记:先给每个非零行分配唯一的组ID,零行暂时标记为NA;
  2. 组归属填充:从下往上填充NA,让每一段连续的零行都归属到后续第一个非零行的组中;
  3. 均分替换:按组计算长度,将组内唯一的非零值除以组长度,替换组内所有行的C1值。

这种方法无需循环,利用向量化操作和分组计算,处理大数据框时效率也很高。

内容的提问来源于stack exchange,提问作者GrBa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:32:15