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

如何按组用加权随机值替换数据中的NA?

自动化按组加权随机替换NA值的解决方案

核心思路

借助dplyr的分组处理能力,对每个letter + number组合的分组单独计算code值的出现频率,以此为权重随机生成填充值替换组内NA,全程自动化,无需手动编写每个分组的规则。

完整代码

library(dplyr)

# 示例数据
df <- structure(list(letter = c("a", "a", "a", "a", "a", "a", "a", 
"a", "b", "b", "b", "b", "b", "b", "b", "b"), number = c(1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), 
code = c("w1", "w1", "w2", NA, "x1", "x2", "x2", NA, "y1", 
"y2", NA, "z1", "z2", "z3", "z4", NA)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -16L))

# 自动化替换NA的处理代码
df_processed <- df %>%
  group_by(letter, number) %>%
  mutate(
    # 统计组内非NA code的出现次数
    code_counts = table(na.omit(code)),
    # 提取有效code值和对应的频率权重
    code_values = names(code_counts),
    code_probs = as.numeric(code_counts) / sum(code_counts),
    # 加权随机生成填充值,替换NA
    filled_code = ifelse(is.na(code),
                        sample(code_values, sum(is.na(code)), replace = TRUE, prob = code_probs),
                        code)
  ) %>%
  ungroup() %>%
  select(-code_counts, -code_values, -code_probs) # 清理中间计算列

# 查看处理结果
print(df_processed)

代码细节解释

  1. 分组拆分:通过group_by(letter, number)将数据按目标维度拆分,保证每个分组独立计算和处理。
  2. 权重计算:
    • table(na.omit(code))统计组内非NA的code值出现次数
    • code_probs将次数转换为频率,确保每个code被选中的概率等于其在组内的出现占比
  3. NA替换:
    • 用sum(is.na(code))获取组内NA的数量,生成对应数量的随机填充值
    • sample()函数通过prob = code_probs参数实现加权随机抽样
    • ifelse()完成NA替换,非NA值保持原样
  4. 结果清理:移除中间生成的辅助计算列,得到简洁的最终数据集

效果验证

以letter=a, number=1组为例:

  • 原组内w1出现2次、w2出现1次,权重为2/3和1/3
  • 组内的NA会以对应概率随机替换为w1或w2,完全匹配需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:50:00