如何按分组多次重排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
相关产品推荐
相关产品推荐

