如何从字符串序列提取元素与值并整理为data.table格式?
如何将R语言字符向量转换为指定格式的data.table
首先明确你的原始数据和目标格式:
原始字符向量
DF1 <- c( "Name : John Miller, Math : 100, History : 80, Physics: 90", "Name : Mary Smith, French : 99, History : 90, Physics: 89", "Name : Eddy Abbot, Math : 90, French : 85, Chemistry : 90" )
目标data.table格式
# Name Math French History Physics Chemistry # 1: John Miller 100 NA 80 90 NA # 2: Mary Smith NA 99 90 89 NA # 3: Eddy Abbot 90 85 NA NA 90
你的思路完全没问题!前两步的拆分逻辑很准确,我来帮你把整个流程落地,重点讲步骤3的具体实现:
步骤1:按逗号分割字符串
用strsplit()把每个字符串按「逗号+空格」拆分,得到一个包含3个元素的列表,每个元素对应一行的键值对:
split_list <- strsplit(DF1, ", ")
步骤2:拆分键值对并整理为单一行data.table
注意你的字符串里混了英文冒号:和中文冒号:,这里用正则表达式匹配两种冒号,把每个键值对拆分开,转成命名列表后再变成单一行的data.table:
library(data.table) # 先加载data.table包 processed_list <- lapply(split_list, function(x) { # 用正则匹配中英文冒号,同时处理前后的空格 kv_pairs <- strsplit(x, "\\s*[::]\\s*") # 提取键和值,生成命名列表 kv_list <- setNames(sapply(kv_pairs, `[`, 2), sapply(kv_pairs, `[`, 1)) # 转成单一行的data.table as.data.table(kv_list) })
步骤3:合并所有行并自动填充缺失值
这一步的核心是用data.table专属的rbindlist()函数,它专门用来合并列表中的data.table,关键参数fill=TRUE会自动识别所有出现过的列,对于某一行没有的列,自动填充NA,完美实现「对应值填充到正确行和列」的需求:
# 合并列表中的所有data.table,缺失列自动填NA result_dt <- rbindlist(processed_list, fill = TRUE) # 可选:调整列顺序和目标格式一致 result_dt <- result_dt[, .(Name, Math, French, History, Physics, Chemistry)]
运行后就能得到和目标格式完全一致的data.table了!
内容的提问来源于stack exchange,提问作者Grec001
相关产品推荐
相关产品推荐

