未知列名时将单列转换为多列的R语言实现方法
在R语言中将list()格式的文本列拆分为多列数据框
原始数据
data <- data.frame(col1 = c( "list(type = \"mac-addr\", spec_version = \"2.1\", id = \"mac-addr--PRIVATE_MAC_ID\", value = \"PRIVATE_MAC_ADDRESS\")", "list(type = \"indicator\", spec_version = \"2.1\", id = \"indicator--PRIVATE_INDICATOR_ID\", created_by_ref = \"identity--PRIVATE_CREATOR_ID\", created = \"PRIVATE_CREATED_TIME\", modified = \"PRIVATE_MODIFIED_TIME\", name = \"Malicious MAC Address\", description = \"Malicious MAC Address\", indicator_types = \"stix\", pattern = \"[mac-addr:value = 'PRIVATE_MAC_ADDRESS']\", pattern_type = \"stix\", pattern_version = \"2.1\", valid_from = \"PRIVATE_VALID_FROM\", lang = \"en\")") )
需求说明
将col1列中包裹在list()内的键值对文本,去除list()结构后拆分转换为多列,缺失的键对应值用NA填充,最终得到符合预期的宽格式数据框。
解决方案
使用dplyr、tidyr和stringr包处理字符串并转换数据格式:
library(dplyr) library(tidyr) library(stringr) # 处理字符串并转换为宽格式 result <- data %>% # 移除首尾的list()包裹 mutate(col1 = str_remove_all(col1, "^list\\(|\\)$")) %>% # 将每个字符串拆分为键值对列表 mutate(key_value = str_split(col1, ", ")) %>% # 展开列表为多行,每行一个键值对 unnest(key_value) %>% # 拆分键和值,保留值中的空格内容 separate(key_value, into = c("key", "value"), sep = " = ", extra = "merge") %>% # 移除值两侧的双引号 mutate(value = str_remove_all(value, '^"|"$')) %>% # 转换为宽格式,缺失值自动填充NA pivot_wider(names_from = key, values_from = value) # 查看结果 print(result) # 若需输出为CSV格式(与预期格式一致) write.csv(result, row.names = FALSE, na = "NA")
结果说明
运行上述代码后,result即为目标数据框,其中缺失的键会自动填充NA。执行write.csv后生成的文件内容与预期输出完全匹配。
内容的提问来源于stack exchange,提问作者Erik Brole
相关产品推荐
相关产品推荐

