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

R语言data.table中tstrsplit如何用Level列值动态设置keep参数

这个需求可以实现,你直接传入Level列失败的原因是tstrsplit的keep参数默认接受全局固定值,不直接支持行级向量输入,调整写法即可实现预期效果,以下是两种常用实现方案:

方案1:逐行分组处理(写法简单,适合中小数据量)

逐行分组后每组的Level是单个数值,可以直接传入keep参数:

library(data.table)
foo <- data.table(Level = c(2,2,3,4,3),
                  ValueId = c("11983:1055521", "11983:1055521-5168:290668-198:100798", "11983:1055521-5168:290668-198:100798-92:91604-139:94569-135:94719-5161:290771-5162:290728-5166:290620",
                             "11983:1055521-5168:290668-198:100798-92:91604-139:94569-135:94719-5161:290771", " 11983:1055521-5168:290676-198:100794-92:91781-139:95090-135:95353"))

foo[, newvar := tstrsplit(ValueId, "-", fixed = TRUE, keep = Level), by = 1:nrow(foo)]

方案2:预拆分+索引取值(效率更高,适合大数据量)

先把所有拆分结果一次性生成,再通过行索引和位置索引匹配取值,避免逐行遍历的性能损耗:

# 先拆分所有ValueId得到所有片段的列表
tmp_split <- tstrsplit(foo$ValueId, "-", fixed = TRUE)
# 按行取对应Level位置的片段赋值
foo[, newvar := mapply(function(row_idx, pos) tmp_split[[pos]][row_idx], .I, Level)]

如果某行的Level数值超过了该行拆分出的片段总数,对应newvar会返回NA,属于正常逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:27:03