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

R语言中按分组比例为数据框列赋值:每组30%行取值为0

R实现按B列分组后每组30%行C列取0的方法

依赖说明

优先推荐使用dplyr包实现,语法简洁易读,也提供基础R的实现方案无需额外安装包。

实现代码

方案1:dplyr实现(推荐)

步骤1:加载包与构造示例数据

# 加载dplyr,未安装先执行 install.packages("dplyr")
library(dplyr)

# 构造示例数据,可替换为你自己的实际数据
df <- data.frame(
  B = rep(c("组1", "组2", "组3"), each = 100),
  other_col = rnorm(300)
)

步骤2:核心赋值逻辑

如果接受比例在30%左右浮动(随机抽样的正常偏差),使用以下代码:

# 固定随机种子可复现结果,不需要可以删除
set.seed(123)

df <- df %>%
  group_by(B) %>% # 按B列分组
  # 组内随机抽样,30%概率取0,70%概率取1(非0值可按需修改)
  mutate(C = sample(c(0, 1), n(), replace = TRUE, prob = c(0.3, 0.7))) %>%
  ungroup()

如果需要严格固定每组30%的行数为0(行数不足时向下取整),修改mutate部分逻辑:

df <- df %>%
  group_by(B) %>%
  mutate(C = ifelse(row_number() %in% sample(n(), size = floor(n()*0.3)), 0, 1)) %>%
  ungroup()

方案2:基础R实现(无需额外安装包)

set.seed(123)
df$C <- ave(rep(NA, nrow(df)), df$B, FUN = function(x) {
  sample(c(0, 1), length(x), replace = TRUE, prob = c(0.3, 0.7))
})

结果验证

可以执行以下代码验证各组0的占比是否符合要求:

df %>% 
  group_by(B) %>% 
  summarise(zero_rate = mean(C == 0))

示例输出如下:
示例输出如下

注意事项

  • 每组样本量越小,随机抽样的实际占比和30%的偏差越大,样本量越大结果越准确
  • 非0值可以按需修改,比如要替换为其他数值,只需要修改sample函数里的第二个元素即可

内容的提问来源于stack exchange,提问作者NM24

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:00:03