在R语言中从数据框行内的字符串提取名称字段内容
提取类JSON文本中的名称字段
嘿,刚接触R语言文本分析不用发愁!你的每行文本其实是类JSON数组格式,只是用了单引号(JSON标准要求双引号),我们只需要做一点点转换,再借助专门的工具包就能轻松提取出名称啦。
步骤1:模拟你的数据框(方便对照)
先假设你的数据框是这样的(和你描述的格式完全一致):
df <- data.frame( sports = c( "[{'id': 16, 'name': 'Soccer'}, {'id': 35, 'name': 'Basketball'}, {'id': 10751, 'name': 'Boxing'}]", "[{'id': 20, 'name': 'Tennis'}, {'id': 40, 'name': 'Swimming'}]" ), stringsAsFactors = FALSE )
步骤2:安装并加载必要的包
我们需要用jsonlite解析JSON格式文本,用dplyr简化数据框操作(基础R也能实现,后面会补充):
install.packages(c("jsonlite", "dplyr")) library(jsonlite) library(dplyr)
步骤3:提取名称字段
核心思路是:先把单引号替换成双引号(转成合法JSON),再解析JSON并提取name值:
df <- df %>% mutate( # 全局替换单引号为双引号,让文本符合JSON规范 sports_json = gsub("'", "\"", sports), # 逐行解析JSON,提取name字段并合并为字符串(也可以保留列表格式) sport_names = sapply(sports_json, function(x) { parsed_data <- fromJSON(x) paste(parsed_data$name, collapse = ", ") # 用逗号分隔多个名称,按需调整分隔符 }) )
如果你习惯用基础R实现,也可以这么写:
# 基础R版本 df$sport_names <- sapply(df$sports, function(x) { clean_json <- gsub("'", "\"", x) parsed_data <- fromJSON(clean_json) paste(parsed_data$name, collapse = ", ") })
结果展示
运行后你的数据框会新增sport_names列,内容示例如下:
| sports | sport_names |
|---|---|
| [{'id': 16, 'name': 'Soccer'}, {'id': 35, 'name': 'Basketball'}, {'id': 10751, 'name': 'Boxing'}] | Soccer, Basketball, Boxing |
| [{'id': 20, 'name': 'Tennis'}, {'id': 40, 'name': 'Swimming'}] | Tennis, Swimming |
特殊情况小提示
如果你的文本中存在名称里带单引号的特殊情况(比如name: 'O'Neil'),全局替换单引号会出错,这时候可以用更精准的正则替换,只替换键名和标点周围的单引号:
# 精准替换:只替换键名(比如'id'、'name')的单引号,以及对象首尾的单引号 sports_json <- gsub("(?<=\\[|, )'(.*?)':|'(?=\\])|'(?=, )", "\"", sports, perl = TRUE)
内容的提问来源于stack exchange,提问作者user36729
相关产品推荐
相关产品推荐

