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

R语言中如何修复数据框内ID对应amount字段的异常值?

问题与解决方案

问题背景

处理R语言中的data frame时,ID为人员编码,同一ID的amount字段在持有期内应保持一致,但存在部分四舍五入异常值,需修正为该ID下的正确值。

原始数据

IDperiodamountshare
1x20200199.879.87
1x20200299.879.87
1x20200399.879.87
1x2020041009.87
1x20200599.879.87
1x20200699.879.87
2x202105111.1111.11
2x202106111.1111.11
2x20210711011.11
2x202108111.1111.11
2x202109111.1111.11
2x202110111.1111.11

目标数据

IDperiodamountshare
1x20200199.879.87
1x20200299.879.87
1x20200399.879.87
1x20200499.879.87
1x20200599.879.87
1x20200699.879.87
2x202105111.1111.11
2x202106111.1111.11
2x202107111.1111.11
2x202108111.1111.11
2x202109111.1111.11
2x202110111.1111.11

解决方案

方法1:基于众数修正(通用场景)

当仅知道同一ID下amount应一致,无明确业务逻辑时,用每个ID下出现次数最多的amount(众数)替换异常值:

# 加载dplyr包
library(dplyr)

# 构造原始数据
df <- data.frame(
  ID = c(rep("1x",6), rep("2x",6)),
  period = c(202001:202006, 202105:202110),
  amount = c(99.87,99.87,99.87,100,99.87,99.87,111.11,111.11,110,111.11,111.11,111.11),
  share = c(rep(9.87,6), rep(11.11,6))
)

# 修正数据
df_fixed <- df %>%
  group_by(ID) %>%
  mutate(
    # 获取当前ID下的众数作为正确值
    correct_amount = as.numeric(names(sort(table(amount), decreasing = TRUE)[1])),
    # 标记异常值(可选)
    is_anomaly = amount != correct_amount,
    # 替换异常值
    amount = correct_amount
  ) %>%
  ungroup() %>%
  # 移除辅助列(可选)
  select(-correct_amount, -is_anomaly)

# 查看结果
print(df_fixed)

方法2:基于业务逻辑修正(更精准)

从示例数据可看出amount = share * 10,若存在此类明确业务规则,直接通过计算修正:

df_fixed <- df %>%
  mutate(
    # 基于share计算正确的amount
    correct_amount = share * 10,
    # 标记异常值(可选)
    is_anomaly = amount != correct_amount,
    # 替换异常值
    amount = correct_amount
  ) %>%
  select(-correct_amount, -is_anomaly)

print(df_fixed)

内容的提问来源于stack exchange,提问作者Facundo Javier Vargas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:15:47