如何用dplyr将dataframe特定值替换为同组内随机非999行对应值
实现代码
先加载dplyr包:
library(dplyr)
执行转换逻辑:
# 可选:设置随机种子固定替换结果,方便复现 # set.seed(123) df_res <- df %>% group_by(team) %>% mutate( # 生成当前分组内非999的候选数据子集 valid_pool = list(filter(cur_data(), result != "999")), # 同时处理两个需要替换的列 across(c(result, result_number), ~ if_else( result == "999", sample(valid_pool[[1]][[cur_column()]], size = 1), .x )) ) %>% # 移除辅助列,取消分组 select(-valid_pool) %>% ungroup()
逻辑说明
- 按
team字段分组,确保替换操作的候选集仅来自同一分组 - 用
cur_data()获取当前分组的全量数据,过滤掉result为999的行后存为列表类型的辅助列valid_pool,每个分组对应一个独立的候选集 - 用
across同时批量处理result和result_number两列:仅当行的result为999时,从候选集的对应列随机抽取1个值替换,否则保留原始值 - 最后移除辅助列、取消分组即可得到结果
内容的提问来源于stack exchange,提问作者Parseltongue
相关产品推荐
相关产品推荐

