R中按列表值复制data.table并更新ListCode列的方法
R语言data.table复制并赋值ListCode列解决方案
假设你的原data.table示例如下:
library(data.table) # 原表 dt <- data.table(ID = 1:2, Value = c("X", "Y")) # 目标ListCode值 l <- c(2, 3, 4)
下面提供几种高效的解决方法:
方法一:先复制行再批量赋值(data.table原生操作)
先将原表的每一行重复length(l)次,再给ListCode列按组赋值:
# 复制行:每一行复制length(l)次 result <- dt[rep(seq_len(.N), length(l))] # 给ListCode列赋值:每个l元素重复原表行数的次数 result[, ListCode := rep(l, each = .N/length(l))]
方法二:基于已用uncount的结果补充赋值
如果你已经用tidyr::uncount完成了行复制,只需给新生成的表批量赋值即可:
library(tidyr) # 已完成的复制操作 dt_uncounted <- dt %>% uncount(length(l)) # 补充赋值ListCode dt_uncounted[, ListCode := rep(l, each = nrow(dt))]
方法三:利用笛卡尔积直接生成结果(最简洁)
借助data.table的笛卡尔积特性,一步生成目标表:
result <- dt[CJ(ListCode = l, unique = TRUE), on = .(), allow.cartesian = TRUE]
这个方法会自动将原表的每一行与l中的每个元素进行组合,直接得到复制后并带有对应ListCode的结果。
验证结果
最终生成的表结构如下:
ID Value ListCode 1: 1 X 2 2: 2 Y 2 3: 1 X 3 4: 2 Y 3 5: 1 X 4 6: 2 Y 4
内容的提问来源于stack exchange,提问作者Bryan F.
相关产品推荐
相关产品推荐

