使用 R 创建数据表
介绍
data.table包是data.frame的增强版本,它是使用R 的实际结构。数据框非常有用,为用户提供了一种组织、查看和访问数据的直观方式。它们的局限性在于,对大型数据集执行快速数据操作变得更加棘手。此外,代码可能变得复杂且与数据框不一致。在这种情况下,data.table是一个更好的选择,因为它具有一致的语法、高效的内存和并行化。
在本指南中,您将了解data.table的基础知识以及如何将其应用于数据操作和聚合任务。让我们从了解数据开始。
数据
在本指南中,我们将使用包含 600 个观测值和 10 个变量的虚构贷款申请数据集:
Marital_status:申请人是否已婚(“是”)或未婚(“否”)
家属:申请人家属人数
Is_graduate:申请人是否为毕业生(“是”)或不是(“否”)
收入:申请人的年收入(美元)
Loan_amount:提交申请的贷款金额(美元)
Credit_score:申请人的信用评分是良好(“满意”)还是不良好(“不满意”)
Approval_status:贷款申请是否已获批准(“1”)或未获批准(“0”)
年龄:申请人的年龄(岁)
性别:申请人是男性(“M”)还是女性(“F”)
目的:申请贷款的目的
让我们首先加载所需的库和数据。
使用 fread 快速读取数据
在 R 中加载数据的常用方法是通过readr库的read_csv()函数。这对于较小的数据集很有效,但在处理大数据时效率不高。data.table包提供了一种更快的替代方法来读取数据,即使用fread()函数,这是一个快速且并行的文件读取器,可以读取本地文件、来自网络的文件,甚至字符串文件。
下面的代码行加载所需的库,使用fread函数读取数据,并打印数据视图。
library(data.table)
library(dplyr)
dat <- fread("data_eng.csv")
glimpse(dat)
输出:
Observations: 600
Variables: 10
$ Marital_status <chr> "Yes", "No", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",...
$ Dependents <int> 1, 0, 0, 1, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, ...
$ Is_graduate <chr> "No", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "Yes",...
$ Income <int> 298500, 315500, 295100, 319300, 333300, 277700, 332100...
$ Loan_amount <int> 71000, 75500, 70000, 70000, 98000, 71000, 58000, 64000...
$ Credit_score <chr> "Satisfactory", "Satisfactory", "Satisfactory", "Satis...
$ approval_status <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
$ Age <int> 74, 71, 71, 68, 64, 64, 63, 61, 60, 59, 56, 55, 54, 54...
$ Sex <chr> "M", "M", "M", "M", "M", "M", "M", "M", "M", "M", "M",...
$ Purpose <chr> "Wedding", "Wedding", "Wedding", "Wedding", "Wedding",...
输出显示数据集有五个数值变量(标记为“ int ”)和五个定性变量(标记为chr)。要使用data.table库,需要使用下面的代码行将data.frame转换为data.table 。结果数据的结构表明它既是data.table又是data.frame。
dat = as.data.table(dat)
str(dat)
输出:
Classes ‘data.table’ and 'data.frame': 600 obs. of 10 variables:
$ Marital_status : chr "Yes" "No" "Yes" "Yes" ...
$ Dependents : int 1 0 0 1 2 0 1 0 0 0 ...
$ Is_graduate : chr "No" "Yes" "Yes" "Yes" ...
$ Income : int 298500 315500 295100 319300 333300 277700 332100 320000 300400 311100 ...
$ Loan_amount : int 71000 75500 70000 70000 98000 71000 58000 64000 61000 75500 ...
$ Credit_score : chr "Satisfactory" "Satisfactory" "Satisfactory" "Satisfactory" ...
$ approval_status: int 1 1 1 1 1 1 1 1 1 1 ...
$ Age : int 74 71 71 68 64 64 63 61 60 59 ...
$ Sex : chr "M" "M" "M" "M" ...
$ Purpose : chr "Wedding" "Wedding" "Wedding" "Wedding" ...
- attr(*, ".internal.selfref")=<externalptr>
我们现在准备执行数据科学中常见的数据处理和聚合任务。
选择行和列
一个常见的数据操作任务是根据特定的行和列进行数据切片。
选择行
要提取单行数据,我们可以使用语法dataset[rownumber, ]。例如,下面的代码行打印第三行。
d1 = dat[3,]
str(d1)
输出:
Classes ‘data.table’ and 'data.frame': 1 obs. of 10 variables:
$ Marital_status : chr "Yes"
$ Dependents : int 0
$ Is_graduate : chr "Yes"
$ Income : int 295100
$ Loan_amount : int 70000
$ Credit_score : chr "Satisfactory"
$ approval_status: int 1
$ Age : int 71
$ Sex : chr "M"
$ Purpose : chr "Wedding"
- attr(*, ".internal.selfref")=<externalptr>
输出显示结果数据有一行和十个观测值。也可以提取一系列行。下面的代码提取第三到第五行和所有列,然后将它们存储在新对象d ' 中。第二行打印新数据的结构:10 个变量的 3 个观测值。
d1 = dat[3:5,]
str(d1)
输出:
Classes ‘data.table’ and 'data.frame': 3 obs. of 10 variables:
$ Marital_status : chr "Yes" "Yes" "Yes"
$ Dependents : int 0 1 2
$ Is_graduate : chr "Yes" "Yes" "Yes"
$ Income : int 295100 319300 333300
$ Loan_amount : int 70000 70000 98000
$ Credit_score : chr "Satisfactory" "Satisfactory" "Satisfactory"
$ approval_status: int 1 1 1
$ Age : int 71 68 64
$ Sex : chr "M" "M" "M"
$ Purpose : chr "Wedding" "Wedding" "Wedding"
- attr(*, ".internal.selfref")=<externalptr>
还可以对行进行高级过滤。如果我们想检查申请人的信用记录不令人满意但贷款仍然获得批准的记录,我们可以使用下面的第一行代码来实现。
第二行打印结果数据的维度:38 行和 10 个变量。第三行打印两个变量的表格。输出显示有 38 名申请人的信用评分不理想,但他们的贷款申请已获批准。
d1 = dat[approval_status == 1 & Credit_score != "Satisfactory"]
dim(d1)
table(d1$approval_status, d1$Credit_score)
输出:
Not _satisfactory
1 38
数据子集辅助函数
使用data.table的优点是它提供了许多辅助函数,可以实现高效的数据操作。
%like%:此函数允许我们在字符或因子变量中搜索模式。下面第一至第三行代码说明了这一点,这些代码对变量Purpose以字符串Personal开头的所有行进行了子集化。
%between%:此函数允许我们搜索闭区间内的值。下面第四至第六行代码说明了这一点,这些代码对申请人收入介于 384,975 美元(第一四分位数)和 766,100 美元(第三四分位数)之间的所有行进行了子集化。
%chin%:此函数仅适用于字符向量。下面第七至第十行代码说明了这一点,这些代码对所有贷款申请目的为“家具”、“商业”或“婚礼”的行进行了子集化。
# Lines 1 - 3: helper - %like%
d1 = dat[Purpose %like% "^Personal"]
dim(d1)
table(d1$Purpose)
# Lines 4 - 6: helper - %between%
d1 = dat[Income %between% c(384975, 766100)]
dim(d1)
summary(d1$Income)
# Lines 7 - 10: helper - %chin%
table(dat$Purpose)
d1 = dat[Purpose %chin% c("Furniture", "Business", "Wedding")]
dim(d1)
table(d1$Purpose)
输出:
# Output - Lines 1 – 3
[1] 166 10
Personal
166
# Output - Lines 4 – 6
[1] 301 10
Min. 1st Qu. Median Mean 3rd Qu. Max.
385200 444400 508400 529978 611100 766100
# Output - Lines 7 – 10
Business Education Furniture Personal Travel Wedding
43 191 38 166 123 39
[1] 120 10
Business Furniture Wedding
43 38 39
选择列
使用相应的名称可以轻松选择data.table中的列。例如,下面的代码行将提取Purpose变量的整个值向量。summary函数确认生成的向量d1的长度为 600 个值。
d1 = dat[, Purpose]
str(d1)
输出:
chr [1:600] "Wedding" "Wedding" "Wedding" "Wedding" "Wedding" "Wedding" ..
也可以使用list()函数选择多列。下面的第一行代码选择所有行和两个指定的列,而第二行打印结果数据的结构。
d1 = dat[, list(approval_status, Income)]
str(d1)
输出:
Classes ‘data.table’ and 'data.frame': 600 obs. of 2 variables:
$ approval_status: int 1 1 1 1 1 1 1 1 1 1 ...
$ Income : int 298500 315500 295100 319300 333300 277700 332100 320000 300400 311100 ...
- attr(*, ".internal.selfref")=<externalptr>
我们已经学习了如何选择列,但有时我们可能想要取消选择某些列。这可以使用采用-c("col1", "col2", ...)形式的便捷函数来完成。例如,下面的代码行创建了一个排除变量Sex和Dependents的数据子集。代码的输出证实了这种排除。
d2 <- dat[, -c("Sex", "Dependents")]
dim(d2)
names(d2)
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~