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

如何在R data.table中同时拆分多列逗号分隔值并展开为多行?

多列逗号分隔值拆分多行问题

我有若干包含逗号分隔值的列,希望将它们按共享的by列拆分为多行,涉及列包括Model、Pathological Tau、Tau Enzymes。这些列的逗号分隔值是对齐的,顺序会被保留,拆分后总计应为51行。

单列处理可行代码

单列情况下可正常处理,代码如下:

mycol = "Model"
f <- e[, .(tstrsplit(.SD, ", ")), by = c(names(e)[names(e) != mycol]), .SDcols = mycol]
setnames(f, old = c(paste0("V", seq_along(mycol))), new = mycol)
f[, (mycol) := unlist(.SD), .SDcols = mycol]

多列处理报错情况

但处理多列时,结果会被存入V1,尝试提取列表项到对应列时均报错:

mycol = c("Model", "Pathological Tau", "Tau Enzymes")
f <- e[, .(tstrsplit(.SD, ", ")), by = c(names(e)[!names(e) %in% mycol]), .SDcols = mycol]

# 以下操作均报错
f[, c(mycol) := lapply(V1, unlist), by = .I]
f[, c(mycol) := unlist(V1), by = .I]
f[, (mycol) := unlist(V1), by = .I]

Error in `[.data.table`(f, , `:=`(c(mycol), unlist(V1)), by = .I) :
  Supplied 3 items to be assigned to group 1 of size 1 in column 'Model'. The RHS length must either be 1 (single values are ok) or match the LHS length exactly. If you wish to 'recycle' the RHS please use rep() explicitly to make this intent clear to readers of your code.

我认为该报错不合逻辑,因为左侧(LHS)的长度是3。

测试数据

structure(list(Strategy = c("General neuroprotection", "Immune response",
"Neuromodulator/transmission", "Passive immunization", "Passive immunization",
"Passive immunization", "Passive immunization", "Passive immunization",
"Passive immunization", "Passive immunization", "Passive immunization",
"Passive immunization", "Passive immunization", "Passive immunization",
"Passive immunization", "Passive immunization", "Passive immunization",
"Passive immunization", "Passive immunization", "Proteostasis network",
"Proteostasis network", "Tau aggregation", "Tau aggregation",
"Tau aggregation", "Tau enzyme/PTM"), Page = c(5L, 4L, 4L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L,
3L, 2L, 2L, 2L, 2L), Model = c("hTau.P301S, THY-Tau22 (G272V/P301S)",
"Tau.P301L, hTau.P301S", "Tau-ΔK280, TauRD-ΔK280, rTg4510 (P301L)",
"JNPL3 (P301L), hTau.P301S", "JNPL3 (P301L), PS19 (P301S)", "JNPL3 (P301L), Tau.P301L",
"PS19 (P301S), hTau", "K3 (K396I), pR5 (P301L)", "hTau, JNPL3 (P301L)",
"hTau, JNPL3 (P301L)", "JNPL3 (P301L), rTg4510 (P301L)", "JNPL3 (P301L), rTg4510 (P301L)",
"Tau609, Tau784", "JNPL3 (P301L), rTg4510 (P301L)", "JNPL3 (P301L), hTau.P301S",
"JNPL3 (P301L), rTg4510 (P301L)", "K3 (K396I), pR5 (P301L)",
"K3 (K396I), pR5 (P301L)", "JNPL3 (P301L), hTau.P301S", "rTg4510, PS19 (P301S)",
"hTau.P301S, rTg4510 (P301L)", "hTau40(296–390aa) line 1 (L1), line 66 (P301S/G335D)",
"Tau-ΔK280, TauRD-ΔK280", "hTau40(296–390aa) line 1 (L1), line 66 (P301S/G335D)",
"pR5 (P301L), K3 (K369I)"), `Pathological Tau` = c("NT, NT",
"DE, NT", "NT, NT, NT", "NT, NT", "DE, DE", "NT, NT", "NT, NT",
"NE, NE", "NT, NT", "NT, NT", "DE, DE", "NE, NE", "DE, NE", "DE, DE",
"DE, DE", "DE, NE", "NE, NE", "DE, NE", "DE, DE", "NE, DE", "DE, DE",
"DE, DE", "DE, NE", "DE, DE", "DE, DE"), `Tau Enzymes` = c("NT, NT",
"NT, NT", "NT, NT, NT", "NT, NT", "NT, NT", "NT, NT", "NT, NT",
"NT, NT", "NT, NT", "NT, NT", "NT, NT", "NT, NT", "NT, NT", "NT, NT",
"NT, NT", "NT, NT", "NT, NT", "NT, NT", "NT, NT", "NT, NT", "NT, NT",
"NT, NT", "NT, NT", "NT, NT", "NT, NE")), class = c("data.table",
"data.frame"), row.names = c(NA, -25L), sorted = "Strategy")

最终解决方案

感谢解答,最终可动态指定列范围的版本如下:

# 拆分含多个条目列
mycol <- cols[5:length(cols)]
d <- b[, lapply(.SD, \(x) unlist(tstrsplit(x, ", "))), 
  by = c(names(b)[!names(b) %in% mycol]), 
  .SDcols = mycol
]

内容的提问来源于Stack Exchange,提问作者dragon951

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:54:56