Skip to content

R - JSON 文件

JSON(JavaScript 对象表示法)是一种轻量级、基于文本的数据交换格式。它具有人类可读性,并且机器易于解析和生成。JSON 是 Web 上数据交换的主要格式,常用于 API 和配置文件。在 R 中,jsonlite 包是处理 JSON 的现代标准,它在 JSON 数据和 R 的原生数据结构之间提供了一个强大且高性能的桥梁。

虽然存在像 rjson 这样的旧包,但 jsonlite 现在是推荐的选择。它与现代 R 生态系统,特别是 tidyverse,良好集成。它能智能地将 JSON 对象转换为 R 数据框或列表。你可以直接从 CRAN 安装它。如果你安装了 tidyverse 元包,它也会被包含在内。

# 安装用于 JSON 操作的推荐包
install.packages("jsonlite")
# 或者,安装包含 jsonlite 和其他有用包的整个 tidyverse
# install.packages("tidyverse")

让我们创建一个结构良好的 JSON 文件。注意使用适当的数据类型:ID 和 Salary 使用数字,日期使用标准 YYYY-MM-DD 格式。将以下内容保存到名为 employees.json 的文件中。

{
"ID": [1, 2, 3, 4, 5, 6, 7, 8],
"Name": ["Rick", "Dan", "Michelle", "Ryan", "Gary", "Nina", "Simon", "Guru"],
"Salary": [623.3, 515.2, 611.0, 729.0, 843.25, 578.0, 632.8, 722.5],
"StartDate": ["2012-01-01", "2013-09-23", "2014-11-15", "2014-05-11", "2015-03-27", "2013-05-21", "2013-07-30", "2014-06-17"],
"Dept": ["IT", "Operations", "IT", "HR", "Finance", "IT", "Operations", "Finance"]
}

只要 JSON 结构像示例中那样是等长数组的集合,jsonlite::fromJSON() 函数就可以一步读取 JSON 文件并将其简化为 R 数据框。

# 加载包
library(jsonlite)
# 定义文件路径(确保 'employees.json' 在你的工作目录中)
file_path <- "employees.json"
# 直接将 JSON 文件读取到数据框中
# fromJSON 函数足够智能,可以直接在此处创建数据框。
employees_df <- fromJSON(file_path)
# 打印生成的数据框
print(employees_df)
# 验证结构以查看列类型
str(employees_df)

当你执行上述代码时,你将得到一个整洁、即用的数据框:

ID Name Salary StartDate Dept
1 1 Rick 623.30 2012-01-01 IT
2 2 Dan 515.20 2013-09-23 Operations
3 3 Michelle 611.00 2014-11-15 IT
4 4 Ryan 729.00 2014-05-11 HR
5 5 Gary 843.25 2015-03-27 Finance
6 6 Nina 578.00 2013-05-21 IT
7 7 Simon 632.80 2013-07-30 Operations
8 8 Guru 722.50 2014-06-17 Finance
'data.frame': 8 obs. of 5 variables:
$ ID : int 1 2 3 4 5 6 7 8
$ Name : chr "Rick" "Dan" "Michelle" "Ryan" ...
$ Salary : num 623 515 611 729 843 ...
$ StartDate: chr "2012-01-01" "2013-09-23" "2014-11-15" "2014-05-11" ...
$ Dept : chr "IT" "Operations" "IT" "HR" ...

实际应用:使用 dplyr 进行数据分析

Section titled “实际应用:使用 dplyr 进行数据分析”

一旦数据转换为数据框,你就可以使用像 dplyr 这样强大的工具进行分析。例如,我们来将 StartDate 转换为正确的日期对象,并计算每个部门的平均工资。

# 加载 dplyr 包(tidyverse 的一部分)
library(dplyr)
# 使用管道符执行数据操作
employee_summary <- employees_df |>
mutate(StartDate = as.Date(StartDate)) |>
group_by(Dept) |>
summarise(
AverageSalary = mean(Salary),
EmployeeCount = n()
) |>
arrange(desc(AverageSalary))
# 打印汇总表
print(employee_summary)

这段现代化、可读性强的代码生成一个易于理解的汇总结果:

# A tibble: 4 × 3
Dept AverageSalary EmployeeCount
<chr> <dbl> <int>
1 Finance 783. 2
2 HR 729 1
3 IT 597. 3
4 Operations 574. 2