如何按设定频率随机修改R数据框每行的指定数量取值
实现代码
首先直接给出满足需求的完整可运行代码,核心逻辑是给每行随机生成0-5的修改列数,仅对选中的列执行替换规则,其余列保留原值,最大程度和原数据保持一致:
library(dplyr) library(purrr) # 构造示例数据 df <- structure(list(V1 = c("chr1:10150", "chr1:10219", "chr1:10230", "chr1:10427", "chr1:10439", "chr1:10440", "chr1:10443", "chr1:13459", "chr1:14397", "chr1:15219"), V2 = c("Y", "Y", "Y", "N", "-", "N", "Y", "N", "Y", "N"), V3 = c("N", "N", "N", "N", "N", "N", "N", "N", "Y", "N"), V4 = c("N", "Y", "-", "-", "-", "N", "Y", "N", "-", "N"), V5 = c("Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "N"), V6 = c("-", "-", "-", "Y", "-", "Y", "Y", "N", "Y", "N"), V7 = c("Y", "N", "N", "N", "Y", "Y", "Y", "N", "Y", "N" ), V8 = c("N", "N", "Y", "-", "-", "N", "Y", "N", "N", "N"), V9 = c("N", "N", "N", "N", "-", "N", "Y", "N", "Y", "-"), V10 = c("N", "Y", "N", "N", "N", "Y", "-", "Y", "Y", "N"), V11 = c("N", "N", "N", "N", "N", "N", "N", "N", "N", "N")), row.names = c(NA, -10L), class = "data.frame") # 自定义值替换规则,可根据需求自行调整 modify_val <- function(x) { case_when( x == "Y" ~ "-", x == "N" ~ "Y", x == "-" ~ "Y" ) } # 核心处理逻辑 df_modified <- df %>% rowwise() %>% mutate( # 随机生成当前行要修改的列数,范围0-5,可自行调整范围 n_modify = sample(0:5, size = 1), vals = list(c_across(V2:V11)), # 随机选中要修改的列索引 modify_idx = list(sample(1:10, size = n_modify)), new_vals = list({ v <- vals v[modify_idx] <- modify_val(v[modify_idx]) v }) ) %>% ungroup() %>% # 把修改后的数据还原为原数据框结构 mutate(V2 = map_chr(new_vals, 1), V3 = map_chr(new_vals, 2), V4 = map_chr(new_vals, 3), V5 = map_chr(new_vals, 4), V6 = map_chr(new_vals, 5), V7 = map_chr(new_vals, 6), V8 = map_chr(new_vals, 7), V9 = map_chr(new_vals, 8), V10 = map_chr(new_vals, 9), V11 = map_chr(new_vals, 10)) %>% select(V1, V2:V11)
参数调整说明
- 要修改每行允许的编辑列数范围,直接调整
sample(0:5, size = 1)里的起始和终止数值即可,比如要限定每行修改1-3个值就改成sample(1:3, size = 1) - 要调整值替换规则,直接修改
modify_val函数内的case_when逻辑即可 - 需要固定可复现的随机结果,运行代码前先执行
set.seed(自定义整数),比如set.seed(123)
内容的提问来源于stack exchange,提问作者neuron
相关产品推荐
相关产品推荐

