使用dplyr的mutate_at结合pmin实现数值屏蔽与取整处理
解决方案:次小值取整至最近百位的实现
R 实现方案
示例数据与前置处理
# 构造示例数据 df <- data.frame( Group1 = c(150, 220, 80, 310, 450), Group2 = c(90, 280, 190, 350, 500), Total = c(240, 500, 270, 660, 950) ) # 已完成的阈值屏蔽:将<100的值设为NA df[df < 100] <- NA
次小值处理函数
process_second_min <- function(col) { # 提取非NA的唯一值,避免重复值干扰次小判断 non_na_unique <- unique(col[!is.na(col)]) # 若非NA值不足2个,直接返回原列 if (length(non_na_unique) < 2) { return(col) } # 排序后取次小值 sorted_vals <- sort(non_na_unique) second_min <- sorted_vals[2] # 取整至最近百位 rounded_val <- round(second_min / 100) * 100 # 替换原列中的次小值 col[col == second_min] <- rounded_val return(col) }
应用到数据列
# 处理所有数值分组列 numeric_groups <- setdiff(names(df), "Total") df[numeric_groups] <- lapply(df[numeric_groups], process_second_min) # 单独处理合计列 df$Total <- process_second_min(df$Total)
Python 实现方案
示例数据与前置处理
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame({ 'Group1': [150, 220, 80, 310, 450], 'Group2': [90, 280, 190, 350, 500], 'Total': [240, 500, 270, 660, 950] }) # 已完成的阈值屏蔽:将<100的值设为NA df[df < 100] = np.nan
次小值处理函数
def process_second_min(col): # 提取非NA的唯一值 non_na_unique = col.dropna().unique() # 若非NA值不足2个,直接返回原列 if len(non_na_unique) < 2: return col # 排序后取次小值 sorted_vals = np.sort(non_na_unique) second_min = sorted_vals[1] # 取整至最近百位 rounded_val = round(second_min / 100) * 100 # 替换原列中的次小值 col.loc[col == second_min] = rounded_val return col
应用到数据列
# 处理所有数值分组列 numeric_groups = df.columns.drop('Total') df[numeric_groups] = df[numeric_groups].apply(process_second_min) # 单独处理合计列 df['Total'] = process_second_min(df['Total'])
关键说明
- 去重逻辑:先提取唯一值再排序,避免因重复最小值导致次小值判断错误(例如列中存在多个相同的最小值时,次小值不应与最小值重复)。
- 边界处理:当列中非NA值不足2个时,不做任何修改,避免报错。
- 取整调整:若需强制向上/向下取整,可将
round()替换为math.ceil()或math.floor()(Python需导入math模块,R使用ceiling()或floor())。
内容的提问来源于stack exchange,提问作者dentistanddatascientist
相关产品推荐
相关产品推荐

