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

