You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:15:01