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

如何按分组多次重排data.table的status列并生成1000个新列?

按分组批量生成重排列的解决方案

模拟数据

district <- c(1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3)                                       
village <- c(1,2,3,4,1,2,3,4,5,1,2,3,4,5,6,7)                              
status <- c(1,0,1,0,1,1,1,0,0,1,1,1,1,0,0,0)
datei <- data.table(district, village, status) 

需求与单次实现

需要按district分组对status列进行重排,单次重排的实现代码如下:

datei[, randomstat := sample(status), district]

问题:批量生成1000次重排列失败

尝试以下代码执行失败:

n <- 1000
datei[, paste0("randomstat", 1:n) := replicate(n, list(sample(status), district))]

正确实现方案

方案一:直接在分组内批量生成

n <- 1000
datei[, paste0("randomstat", 1:n) := lapply(1:n, function(x) sample(status)), by = district]

方案二:高效批量生成(适合大n场景)

n <- 1000
# 按分组生成n次重排的结果列表
replicate_list <- datei[, .(replicate(n, sample(status), simplify = FALSE)), by = district]
# 转置后赋值给新列
datei[, paste0("randomstat", 1:n) := do.call(rbind, replicate_list$V1)]

错误原因说明

原代码的问题在于:

  • replicate的逻辑错误,没有在分组内执行sample(status),而是全局操作;
  • 返回的结构是每个元素包含sample结果和district,不符合data.table多列赋值的格式要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:46:08