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
相关产品推荐
相关产品推荐

