在R中如何将FHIR嵌套JSON转换为结构化DataFrame?
解决FHIR QuestionnaireResponse JSON转每行对应参与者的DataFrame问题
先加载所需R包
library(jsonlite) library(dplyr) library(tidyr)
完整处理代码
# 解析JSON数据 parsed_json <- fromJSON(json_data, simplifyDataFrame = FALSE) # 提取所有页面下的问题项,扁平化嵌套结构 questions <- unlist(lapply(parsed_json$item, function(page) page$item), recursive = FALSE) # 逐个处理每个问题,生成带参与者索引的长表 processed_data <- lapply(questions, function(q) { # 提取问题的标识和文本 link_id <- q$linkId text <- q$text # 提取每个参与者的答案,同时添加参与者序号(1、2对应两位参与者) answers <- tibble( participant = 1:length(q$answer), value = sapply(q$answer, function(a) unlist(a)) ) # 关联问题信息 answers %>% mutate(linkId = link_id, text = text) }) %>% bind_rows() # 转换为目标宽表:每行对应一位参与者,每列对应一个问题的答案 final_df <- processed_data %>% pivot_wider( id_cols = participant, names_from = c(linkId, text), values_from = value, names_sep = ": " ) %>% # 修复数据类型(根据原始答案的类型转换) mutate( `1.2: Quel est votre âge?` = as.integer(`1.2: Quel est votre âge?`), `2.2: Nombre dannées dexpérience?` = as.integer(`2.2: Nombre dannées dexpérience?`), `2.3: Êtes-vous heureux?` = as.logical(`2.3: Êtes-vous heureux?`) )
为什么你的原始方法失效?
你之前直接多次使用unnest_wider会打乱数据关联:每个问题的answer是对应两位参与者的列表,直接unnest会把不同问题的答案拆成独立行,无法保证同一参与者的不同问题答案能对应起来,最终得到的是混乱的冗余数据。
最终结果示例
运行上述代码后,final_df会输出符合需求的结构:
# A tibble: 2 × 6 participant `1.1: Quel est votre nom?` `1.2: Quel est votre âge?` `1.3: Quel est votre lieu de résidence?` `2.2: Nombre dannées dexpérience?` `2.3: Êtes-vous heureux?` <int> <chr> <int> <chr> <int> <lgl> 1 1 Participant 1 30 Ville A 5 TRUE 2 2 Participant 2 25 Ville B 2 FALSE
内容的提问来源于stack exchange,提问作者Akram HECINI
相关产品推荐
相关产品推荐

