如何用case_when随机修改id=10分组中20%行的Room1列值?
解决方案
你可以通过分组后随机抽取指定比例的行来实现需求,以下是两种常用的dplyr实现方式:
方法一:直接在case_when中判断行号
library(dplyr) data <- df %>% group_by(id) %>% mutate( Room1 = case_when( # 仅对id=10组中随机20%的行修改Room1为0.6 id == 10 & row_number() %in% sample(n(), size = 0.2 * n()) ~ 0.6, # 其余情况保留原数值 TRUE ~ as.numeric(Room1) ) ) %>% ungroup()
group_by(id):按id分组处理,确保只针对id=10的组操作n():获取当前分组的行数,这里id=10的组有10行,0.2 * n()即2行sample(n(), size = 0.2 * n()):随机抽取当前分组中20%的行号- 最后用
ungroup()取消分组,避免后续操作受分组影响
方法二:先创建标记列再修改(更直观)
library(dplyr) data <- df %>% group_by(id) %>% mutate( # 给id=10组的行随机标记20%为需要修改 modify_flag = ifelse(id == 10, sample(c(TRUE, FALSE), n(), replace = TRUE, prob = c(0.2, 0.8)), FALSE), # 根据标记修改Room1 Room1 = ifelse(modify_flag, 0.6, Room1) ) %>% ungroup() %>% select(-modify_flag) # 可选:删除临时标记列
sample(c(TRUE, FALSE), n(), replace = TRUE, prob = c(0.2, 0.8)):按20%的概率随机生成布尔值标记需要修改的行- 最后通过
select(-modify_flag)可以移除临时创建的标记列,保持数据整洁
内容的提问来源于stack exchange,提问作者Loz
相关产品推荐
相关产品推荐

