如何在R中按name值递增比例随机将value列设为NA?
在R中按规则为数据框指定行随机替换
value为NA的实现 没问题,这在R里完全可以实现。我们可以结合dplyr的分组操作和随机抽样逻辑,精准匹配你需要的规则。以下是基于你提供的示例数据的完整实现代码:
library(tidyverse) set.seed(0) # 生成示例数据 df <- map_dfc(1:3, \(i) round(rbeta(5, i+.1, i+12, i*.2),2)) %>% pivot_longer(everything()) %>% mutate(name=as.numeric(str_remove(name, "..."))) # 按规则随机替换NA df_with_na <- df %>% group_by(name) %>% mutate( value = case_when( name < 2 ~ value, # name小于2的行不做处理 TRUE ~ ifelse( rbinom(n(), 1, prob = (name - 1) * 0.1) == 1, # 计算对应替换概率:name每加1,概率涨10% NA_real_, value ) ) ) %>% ungroup() # 查看处理后的数据 print(df_with_na)
核心逻辑说明:
- 分组处理:用
group_by(name)把数据按name值分组,保证每个组独立计算随机替换的概率 - 概率匹配:替换概率用
(name - 1)*0.1计算,刚好对应name=2时10%、name=3时20%的要求,后续更高的name值也会自动按10%递增 - 随机替换:
rbinom(n(), 1, prob)会生成和当前组行数一致的0/1随机向量,抽到1的行就把value换成NA,抽到0的保留原值 - 过滤规则:通过
case_when确保name<2的行完全不受影响,保留原始数据
你可以修改set.seed()的值来复现不同的随机结果,也可以调整概率公式来适配其他递增规则。
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

