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

如何使用R语言检查JSON文件中指定字段是否存在并处理写入CSV

解决方案

你原代码的核心问题是字段存在性的判断逻辑写错了:"confirmed"%in%value$delta是检查confirmed是不是value$delta的元素值,不是检查是否存在对应字段,要改成判断字段名列表里是否包含confirmed才能生效。同时你只生成了单行数据,没有追加到数据框中,也没有最终导出csv的步骤。

方案1:修正原有循环逻辑

# 先初始化空数据框,提前定义列类型避免后续类型混乱
df <- data.frame(
  area = character(),
  date = character(),
  delta_confirmed = integer(),
  delta7_confirmed = integer(),
  total_confirmed = integer(),
  stringsAsFactors = FALSE
)

i = 1
for (value in json$TT$dates){
  # 修正字段存在性判断逻辑
  delta_confirmed <- if ("confirmed" %in% names(value$delta)) value$delta$confirmed else 0
  new_row <- data.frame(
    area = 'TT',
    date = names(json$TT$dates)[i],
    delta_confirmed = delta_confirmed,
    delta7_confirmed = value$delta7$confirmed,
    total_confirmed = value$total$confirmed
  )
  # 将新行追加到数据框
  df <- rbind(df, new_row)
  i <- i + 1
}

# 导出为CSV文件
write.csv(df, "confirmed_data.csv", row.names = FALSE, na = "0")

方案2:更简洁的向量化写法(推荐)

用purrr包的pluck函数可以直接指定字段不存在时的默认返回值,不用手动写if判断,代码更简洁不易出错:

library(purrr)
library(dplyr)

# 直接遍历json列表转成数据框
df <- imap_dfr(json$TT$dates, function(value, date_name){
  tibble(
    area = "TT",
    date = date_name,
    # 字段不存在时直接返回0
    delta_confirmed = pluck(value, "delta", "confirmed", .default = 0),
    delta7_confirmed = pluck(value, "delta7", "confirmed", .default = 0),
    total_confirmed = pluck(value, "total", "confirmed", .default = 0)
  )
})

# 导出CSV
write.csv(df, "confirmed_data.csv", row.names = FALSE)

注意事项

  • 如果确认delta7和total层级下一定存在confirmed字段,可以去掉这两个字段的pluck默认值配置
  • 导出时设置na = "0"可以把其他意外空值也统一替换为0输出

内容的提问来源于stack exchange,提问作者Pranjal Kesarwani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:00:00