You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:25:43