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

data.table拆分info列:动态提取字段名生成新列需求

用data.table拆分info列为动态键值对列的解决方案

刚好碰到过类似场景,用data.table的原生操作就能完美解决,完全不需要依赖dplyr/tidyr。直接上代码和解释:

核心思路

先把info列的键值对拆分成长格式的键-值行,再将长格式转换为宽格式,自动生成所有出现过的键作为列名,缺失的字段自动填充NA,最后和原表的核心字段关联。

实现代码

library(data.table)

# 示例输入数据
myDT <- structure(list(chr = c("chr1", "chr2", "chr4"), pos = c(123L, 435L, 120L), info = c("type=3;end=4", "end=6", "end=5;pos=TRUE;type=2" )), class = c("data.table", "data.frame"), row.names = c(NA,-3L))

# 1. 将info拆分为长格式的键值对
longDT <- myDT[, strsplit(info, ";"), by = .(chr, pos)][
  , c("key", "value") := tstrsplit(V1, "=")][
    , V1 := NULL]

# 2. 转换为宽格式,自动生成所有键作为列
wideDT <- dcast(longDT, chr + pos ~ key, value.var = "value")

# 查看最终结果
print(wideDT)

代码解释

  1. 拆分成长格式:

    • strsplit(info, ";")把每个info字符串按分号拆分成单个键值对的向量;
    • by = .(chr, pos)确保每一行的chr和pos会和拆分后的每个键值对一一对应,不会丢失关联关系;
    • tstrsplit(V1, "=")把每个键值对(比如type=3)拆成key和value两列,最后删掉临时生成的V1列。
  2. 转换为宽格式:

    • dcast(longDT, chr + pos ~ key, value.var = "value")是核心操作:
      • chr + pos作为分组的唯一标识,保证每行数据对应原表的一行;
      • key列中的所有唯一值会自动成为新的列名;
      • 没有对应值的位置会自动填充<NA>,完美匹配你的需求。

输出结果

运行代码后会得到和你期望完全一致的结果:

chr pos end  pos type
1: chr1 123   4 <NA>    3
2: chr2 435   6 <NA> <NA>
3: chr4 120   5 TRUE    2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:49:50