R语言sapply处理健身追踪器JSON数据时缺失值转NA方法问询
解决方法
直接修改自定义提取函数,给每个可能缺失的字段设置默认NA兜底,同时处理嵌套字段整体缺失的情况,修改后代码如下:
1. 修改自定义提取函数
# 先定义简易空值替换运算符,无需额外安装依赖包 `%||%` <- function(x, y) if (is.null(x) || length(x) == 0) y else x importPFData <- function(x) { testimport <- fromJSON(x) # 提前提取公共层,避免重复写路径,同时加兜底避免该层整体缺失 exercise <- testimport$exercises %||% list() # 单独处理心率嵌套层,避免该层整体缺失时子字段提取报错 hr <- exercise$heartRate %||% list() # 所有字段都加对应类型的NA兜底,缺失时自动填充 sport <- exercise$sport %||% NA_character_ starttimesession <- exercise$startTime %||% NA_character_ endtimesession <- exercise$stopTime %||% NA_character_ distance <- exercise$distance %||% NA_real_ durationsport <- exercise$duration %||% NA_real_ maxHRsession <- hr$max %||% NA_integer_ minHRsession <- hr$min %||% NA_integer_ avgHRsession <- hr$avg %||% NA_integer_ calories <- exercise$kiloCalories %||% NA_real_ VO2max_overall <- testimport$physicalInformationSnapshot$vo2Max %||% NA_real_ # 返回单行数据框,保留各字段原生类型,后续拼接更方便 data.frame( starttimesession, endtimesession, sport, distance, durationsport, maxHRsession, minHRsession, avgHRsession, calories, VO2max_overall, stringsAsFactors = FALSE ) }
2. 调整批量调用方式
建议用lapply替代sapply,避免sapply自动简化为矩阵导致的类型强制转换问题,直接拼接得到规整dataframe:
# 原文件列表读取逻辑可保留,优化正则匹配避免误判非JSON文件 json_files <- list.files(path, pattern = "\\.json$", full.names = TRUE) # 批量提取后按行绑定直接得到结构化数据集 dataTest <- do.call(rbind, lapply(json_files, importPFData))
修改说明
- 自定义
%||%运算符做非空校验,字段不存在/为空时自动返回对应类型的NA,保证每个返回结果固定为10个字段 - 提前拆分嵌套的
exercises、heartRate层级,避免父字段缺失时子字段提取报错 - 函数直接返回单行数据框,无需额外做格式转换,拼接后可直接用于后续分析
内容的提问来源于stack exchange,提问作者AMWiedl
相关产品推荐
相关产品推荐

