使用 R 拆分和合并数据
介绍
在实际的数据科学项目中,经常需要将数据分成两个或多个子集,或将多个集合合并为一个。这是预测建模数据整理过程不可或缺的一部分。
在本指南中,您将学习使用统计编程语言 R 拆分和合并数据的技术。
合并数据:列
合并或连接数据是一项常见的数据准备任务。merge函数可用于执行所有四个标准连接函数:
内连接
完全连接
左连接
右连接
让我们首先创建用于执行这些操作的示例数据集。
per_data <- data.frame(cust_id = c("ID1", "ID2", "ID3"), married = c("Yes", "No", "Yes"), Age = c(44, 23, 35))
inc_data <- data.frame(cust_id = c("ID2", "ID1", "ID3"), income = c(60000, 80000, 45000))
head(per_data)
head(inc_data)
输出:
cust_id married Age
ID1 Yes 44
ID2 No 23
ID3 Yes 35
cust_id income
ID2 60000
ID1 80000
ID3 45000
内连接
可以使用合并函数水平合并这两个数据集。在我们的例子中,我们将使用公共键变量“UID”对这两个数据集进行内连接。
下面的第一行代码合并两个数据框,而第二行显示结果数据集“merge1”。
merge1 = merge(per_data,inc_data,by="cust_id")
head(merge1)
输出:
| | cust_id | married | Age | income |
|--- |--------- |--------- |----- |-------- |
| 1 | ID1 | Yes | 44 | 80000 |
| 2 | ID2 | No | 23 | 60000 |
| 3 | ID3 | Yes | 35 | 45000 |
完全加入
“完全连接”的结果是保留任一数据集中的所有观察值。下面的第一行代码创建了一个数据框“df3”,而第二行执行完全连接并将对象保存为数据框“df4”。
输出将创建一个数据框,其中所有观测值都保留在结果数据中。缺失的单元格将标记为“NA”。
df3 = data.frame(cust_id = c("ID4", "ID1", "ID5"), approval = c("Yes", "No", "Yes"))
df4 = merge(x = merge1, y = df3, by = "cust_id", all = TRUE)
head(df4)
输出:
| | cust_id | married | Age | income | approval |
|--- |--------- |--------- |----- |-------- |---------- |
| 1 | ID1 | Yes | 44 | 80000 | No |
| 2 | ID2 | No | 23 | 60000 | NA |
| 3 | ID3 | Yes | 35 | 45000 | NA |
| 4 | ID4 | NA | NA | NA | Yes |
| 5 | ID5 | NA | NA | NA | Yes |
左连接
“左连接”函数将右侧数据框中的信息添加到左侧数据框中。让我们对数据框“merge1”和“df3”执行左连接,如下所示。
ljoin = merge(x = merge1, y = df3, by = "cust_id", all.x = TRUE)
head(ljoin)
输出:
| | cust_id | married | Age | income | approval |
|--- |--------- |--------- |----- |-------- |---------- |
| 1 | ID1 | Yes | 44 | 80000 | No |
| 2 | ID2 | No | 23 | 60000 | NA |
| 3 | ID3 | Yes | 35 | 45000 | NA |
输出显示左侧数据集“merge1”中的所有记录都得到维护,而右侧数据集“df3”映射到它。
右连接
“右连接”函数将左侧数据框中的信息添加到右侧数据框中。让我们对数据框“merge1”和“df3”执行右连接,如下所示。
rjoin = merge(x = merge1, y = df3, by = "cust_id", all.y = TRUE)
head(rjoin)
输出:
| | cust_id | married | Age | income | approval |
|--- |--------- |--------- |----- |-------- |---------- |
| 1 | ID1 | Yes | 44 | 80000 | No |
| 2 | ID4 | NA | NA | NA | Yes |
| 3 | ID5 | NA | NA | NA | Yes |
合并数据:行
可以使用rbind函数根据行合并两个数据框。让我们创建两个数据框并使用下面的代码行垂直连接它们。
r1 <- data.frame(cust_id = c("ID11", "ID12", "ID13"), married = c("Yes", "No", "Yes"), Age = c(44, 23, 35))
r2 <- data.frame(cust_id = c("ID14", "ID15"), married = c("Yes", "Yes"), Age = c(40, 35))
r_tot <- rbind(r1, r2)
glimpse(r_tot)
输出:
Observations: 5
Variables: 3
$ cust_id <fct> ID11, ID12, ID13, ID14, ID15
$ married <fct> Yes, No, Yes, Yes, Yes
$ Age <dbl> 44, 23, 35, 40, 35
结果数据现在有 5 个观测值和 3 个变量。要执行此操作,两个数据框必须具有相同的变量,但它们的顺序不必相同。
拆分数据:行
机器学习中最常见的数据分区步骤之一是将数据划分为训练集和测试集,以评估模型性能。这称为模型验证的保留方法。根据目标变量,有许多技术可以执行此任务。
我们将使用包含 600 个观测值和 4 个变量(即“UID”、“收入”、“信用评分”和“审批状态”)的虚构贷款申请数据。下面的代码行加载库和数据。
library(readr)
library(dplyr)
library(caret)
library(caTools)
d1 <- read_csv("data_1.csv")
glimpse(d1)
输出:
Observations: 600
Variables: 4
$ UID <chr> "UIDA7", "UIDA354", "UIDA402", "UIDA467", "UIDA78", "U...
$ Income <int> 333300, 532400, 454700, 368500, 611100, 266700, 243700...
$ Credit_score <chr> "Satisfactory", "Satisfactory", "Satisfactory", "Satis...
$ approval_status <int> 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, ...
由于目标变量“approval_status”是分类变量,我们将其转换为因子变量。
d1$approval_status = as.factor(d1$approval_status)
str(d1$approval_status)
输出:
Factor w/ 2 levels "0","1": 1 2 2 2 1 1 1 1 2 2 ...
我们现在可以使用“caTools”包将数据集分为训练数据集和测试数据集。
下面的第一行代码加载“caTools”库,而第二行设置随机种子以确保结果的可重复性。第三行使用sample.split函数以70比30的比例划分数据。这确保70%的数据分配给训练集,而剩余的30%分配给测试集。这是在第四行和第五行代码中完成的。
library(caTools)
set.seed(150)
split = sample.split(d1$approval_status, SplitRatio = 0.70)
# Create training and testing sets
train = subset(d1, split == TRUE)
test = subset(d1, split == FALSE)
dim(train); dim(test)
输出:
1] 420 4
[1] 180 4
输出确认数据已被分为训练数据和测试数据,分别包含 420 个和 180 个观测值。
结论
在本指南中,您学习了使用基本 R 包合并和拆分数据框的技术。这些技术允许您合并和拆分现实世界数据集中的数据。
要了解有关使用 R 进行数据科学的更多信息,请参阅以下指南:
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~