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)
代码解释
拆分成长格式:
strsplit(info, ";")把每个info字符串按分号拆分成单个键值对的向量;by = .(chr, pos)确保每一行的chr和pos会和拆分后的每个键值对一一对应,不会丢失关联关系;tstrsplit(V1, "=")把每个键值对(比如type=3)拆成key和value两列,最后删掉临时生成的V1列。
转换为宽格式:
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
相关产品推荐
相关产品推荐

