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

