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

如何用data.table按/和,拆分多列生成笛卡尔积式多行数据?

解决data.table多列按多分隔符拆分多行的问题

源数据

library(data.table)
df <- data.table(
   b = c("a", "d/e/f", "g,h"),
   c = c("1", "2,3,4", "5/6")
)

需求说明

需要将列b(分隔符为逗号,和斜杠/)、列c(分隔符为逗号,和斜杠/)同时拆分,使每行拆分后的b元素与c元素形成笛卡尔积组合,得到目标格式的数据表。

解决方案

利用data.table的分组、字符串替换、拆分和交叉连接函数实现:

df_clean <- df[, {
  # 统一替换分隔符为逗号,拆分b列
  b_elements <- unlist(tstrsplit(gsub("/", ",", b), ","))
  # 统一替换分隔符为逗号,拆分c列
  c_elements <- unlist(tstrsplit(gsub("/", ",", c), ","))
  # 生成两列元素的交叉连接
  CJ(b = b_elements, c = c_elements)
}, by = .I][, .I := NULL]

结果验证

运行上述代码后,df_clean的结构与预期一致:

> df_clean
     b c
 1:  a 1
 2:  d 2
 3:  d 3
 4:  d 4
 5:  e 2
 6:  e 3
 7:  e 4
 8:  f 2
 9:  f 3
10:  f 4
11:  g 5
12:  g 6
13:  h 5
14:  h 6

代码解释

  • by = .I:按原数据行索引分组,确保每行的b和c拆分元素仅在本行内组合,避免跨行混淆。
  • gsub("/", ",", x):将斜杠统一替换为逗号,实现用单一分隔符拆分多分隔符的字符串。
  • tstrsplit:data.table专用拆分函数,高效拆分字符串为列表,unlist转为向量便于后续交叉连接。
  • CJ:生成两个向量的笛卡尔积,完美匹配需求中每个b拆分元素对应所有c拆分元素的组合方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:55:16