如何使用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
相关产品推荐
相关产品推荐

