学习之旅11-R数据结构

13 篇文章 0 订阅
7 篇文章 0 订阅

前言

  • 对于数据分析来说,我们首先要做的就是按照相应的格式来创建含有研究价值的数据集。在R中我们需要:1、选择一种数据结构来存储我们的数据结构;2、将数据输入或导入到这个数据结构中;3、根据需要对数据进行进一步处理分析;4、形成分析结果、报告等。

2、R数据集

2.1 数据集

  • 关于数据集: 简单来说数据构成的集合,不同的领域对于数据集的行和列的叫法各有不同。统计学上称为观测和变量,数据分析员也叫记录和字段,还有示例和属性等等。对于数据集来说,里面包括数据内容和数据类型等,R中存储数据的结构有很多种(标量,向量,数组,数据框,列表等)。

在这里插入图片描述

2.2 数据结构

  • 数据结构: R语言提供了各种数据结构来存储我们需要的不同类型的数据:标量,向量,数组,数据框,列表等,不同的数据结构存储数据类型,创建,访问方式均有不同。
  • 对象: 对象是指可以赋值给变量的任何事物(常量、数据结构、函数、图形等)
  • 数据框: 是R用于存储数据的一种结构:列表示变量,行表示观测。对于一个数据框来说,可以存储不同的类型的变量(字符,数值),数据框将是用于存储数据集最常用的数据结构。

2.2.1 向量

  • 向量是用于存储一维数组的一种数据结构,可以支持数值型、字符型、布尔值类型
# 对于同一个向量,只能是同一种类型
age <- c(1, 3, 5, 2, 11, 9, 3, 9, 12, 3); #数值型
sex <- c("男", "男", "女", "男", "女", "男"); # 字符型
pos <- c(TRUE, FALSE, TRUE, TRUE ,TRUE, FALSE); # 布尔型

2.2.2 数据框

  • 由于我们在处理数据经常遇到不同数据类型,此时矩阵无法处理这些数据,而数据框则可以。通过data.frame()创建
data1 <- data.frame(col1,col2,col3) # col1, col2, col3可以是不同类型的,但是col1向量中必须都是同一类型
> id <- c(1,2,3,4,5);
> name <- c("张三","李四","王五","赵六","韩七");
> sex <- c("男","男","女","女","男");
> data1 <- data.frame(id, name, sex); # 此时没有指定列名,将会用对应的id,name,sex来命名。
> names(data1) <- c("序号","姓名","性别")
> data1
  序号 姓名 性别
1    1 张三   男
2    2 李四   男
3    3 王五   女
4    4 赵六   女
5    5 韩七   男

下面通过导入excel文本文件进行数据框的讲解:在text.xls中有两个sheet,分别存放以下数据:
在这里插入图片描述

library(readxl) #载入readxl,来导入我们需要的Excel数据
xl1 <- read_excel("E:\\学习\\text.xls",sheet=1,col_names=TRUE) #读取第一个sheet ,col_names表示含表头
xl2 <- read_excel("E:\\学习\\text.xls",sheet=2,col_names=TRUE)  

在这里插入图片描述

  • 数据合并查询:
# 合并xl1 xl2  通过学号关联合并,all.xl1=all 表示已xl1为主表链接
> xl3 <- merge(xl1,xl2,by ="学号", all.xl1 = all)
> xl3
  学号 姓名 性别 班级 面试 笔试
1  001 张三   男 一班   86   80
2  002 李四   男 二班   78   87
3  003 王五   女 二班   90   90
4  004 赵六   女 一班   68   78
5  005 韩七   男 二班   90   90
# 新增一列总成绩 笔试 0.7 面试0.3,由于excel导入的数据可能不是数值型,这里需要通过as.numeric()函数强制转化成数值型
> xl3$总成绩 <- as.numeric(xl3$面试)*0.7+as.numeric(xl3$笔试)*0.3
> xl3
  学号 姓名 性别 班级 面试 笔试 总成绩
1  001 张三   男 一班   86   80   84.2
2  002 李四   男 二班   78   87   80.7
3  003 王五   女 二班   90   90   90.0
4  004 赵六   女 一班   68   78   71.0
5  005 韩七   男 二班   90   90   90.0
> 

# 取指行,列数据
> xl4 <- xl3[1,] # 通过下标进行取值[x,y] x表示取指定行的数据,y表示取指定列的数据
> xl4
  学号 姓名 性别 班级 面试 笔试 总成绩
1  001 张三   男 一班   86   80   84.2
> xl5 <- xl3[1:3,] # 取1-3行所有数据
> xl5 
  学号 姓名 性别 班级 面试 笔试 总成绩
1  001 张三   男 一班   86   80   84.2
2  002 李四   男 二班   78   87   80.7
3  003 王五   女 二班   90   90   90.0
> xl6 <- xl3[c("姓名","面试","笔试","总成绩")] # 通过c() 来获取向量中对应的数据
> xl6
  姓名 面试 笔试 总成绩
1 张三   86   80   84.2
2 李四   78   87   80.7
3 王五   90   90   90.0
4 赵六   68   78   71.0
5 韩七   90   90   90.0
> 
> xl7 <- xl3[which(xl3$班级=="一班" &xl3$性别=="男"),c("姓名","性别","总成绩")] # 通过which 函数指定哪一个进行筛选
> xl7
  姓名 性别 总成绩
1 张三   男   84.2
> library(dplyr)  #利用sql的方式操作数据框
> xl8 <- select(xl3,"姓名","总成绩"); #通过 select 也可以取数据框中指定的 列数据
> xl8
  姓名 总成绩
1 张三   84.2
2 李四   80.7
3 王五   90.0
4 赵六   71.0
5 韩七   90.0
  • 数据删除:
# 原始数据
> xl3
  学号 姓名 性别 班级 面试 笔试 总成绩
1  001 张三   男 一班   86   80   84.2
2  002 李四   男 二班   78   87   80.7
3  003 王五   女 二班   90   90   90.0
4  004 赵六   女 一班   68   78   71.0
5  005 韩七   男 二班   90   90   90.0
# 删除行列数据  
> xl9 <- xl3[,-1] # 删除数据框xl3 中第一列数据 或者xl8 <- xl3[-1]
> xl9
  姓名 性别 班级 面试 笔试 总成绩
1 张三   男 一班   86   80   84.2
2 李四   男 二班   78   87   80.7
3 王五   女 二班   90   90   90.0
4 赵六   女 一班   68   78   71.0
5 韩七   男 二班   90   90   90.0
> xl01 <- xl3[-1,] # 删除数据库xl3 中第一行数据
> xl01
  学号 姓名 性别 班级 面试 笔试 总成绩
2  002 李四   男 二班   78   87   80.7
3  003 王五   女 二班   90   90   90.0
4  004 赵六   女 一班   68   78   71.0
5  005 韩七   男 二班   90   90   90.0
> xl02 <- select(xl3 ,-"面试",-"总成绩")  # 通过select 函数可以取指定列数据,同时用-“指定列” 则可以去掉对应列数据
> xl02
  学号 姓名 性别 班级 笔试
1  001 张三   男 一班   80
2  002 李四   男 二班   87
3  003 王五   女 二班   90
4  004 赵六   女 一班   78
5  005 韩七   男 二班   90
# rm(xl9) # 删除对应数据
# ls(xl5) # 列出对应标题
# ncol(xl3) #查询xl3数据框的列数
# nrow(xl3) #查询xl3数据框的行数
# ls_li <- ls() # 函数ls的功能是显示所有在内存中的对象:只会列出对象名
# ls.str(xl3) #ls.str()将会展示内存中所有对象的详细信息:
#rm(list = ls()) # 将对象列出后传给列表list ,即清空所有已经存在的数据对象
  • 数据新增: 新增行rbind()、新增列cbind() 数据
#新增行数据:rbind()
> adrow <- c("006","刘八","男","一班",77,88,77*0.7+88*0.3); # 先将新增数据定义好,方便后面使用
> xl3_1 <- rbind(xl3, adrow) ## 在xl3数据框中加入一行adrow,加在最后
> xl3_1
  学号 姓名 性别 班级 面试 笔试 总成绩
1  001 张三   男 一班   86   80   84.2
2  002 李四   男 二班   78   87   80.7
3  003 王五   女 二班   90   90     90
4  004 赵六   女 一班   68   78     71
5  005 韩七   男 二班   90   90     90
6  006 刘八   男 一班   77   88   80.3

> xl3_2 <- rbind(xl3[1:2,], adrow ,xl3[3:nrow(xl3),]); # 在xl3数据框 第3行 加入adrow 这一行数据
> xl3_2
   学号 姓名 性别 班级 面试 笔试 总成绩
1   001 张三   男 一班   86   80   84.2
2   002 李四   男 二班   78   87   80.7
3   006 刘八   男 一班   77   88   80.3
31  003 王五   女 二班   90   90     90
4   004 赵六   女 一班   68   78     71
5   005 韩七   男 二班   90   90     90

> xl3_2 <- rbind(xl3[1:2,], adrow ,xl3[3:nrow(xl3),]); # 在xl3数据框 第3行 加入adrow 这一行数据
> xl3_2
   学号 姓名 性别 班级 面试 笔试 总成绩
1   001 张三   男 一班   86   80   84.2
2   002 李四   男 二班   78   87   80.7
3   006 刘八   男 一班   77   88   80.3
31  003 王五   女 二班   90   90     90
4   004 赵六   女 一班   68   78     71
5   005 韩七   男 二班   90   90     90

> xl3_4 <- rbind(adrow,xl3[1:nrow(xl3),]); # 在xl3数据框第1行 加入adrow 这一行数据,注意后面的数据必须都列出来(即原来第一行的数据到最后一行的数据 1:nrow())
> xl3_4
  学号 姓名 性别 班级 面试 笔试 总成绩
1  006 刘八   男 一班   77   88   80.3
2  001 张三   男 一班   86   80   84.2
3  002 李四   男 二班   78   87   80.7
4  003 王五   女 二班   90   90     90
5  004 赵六   女 一班   68   78     71
6  005 韩七   男 二班   90   90     90
# 新增列数据:cbind()
> bz <- c("合格","合格","优秀","合格","优秀")
> xl3_5 <- cbind(xl3,bz); # 在xl3 数据框中加入一行,加在最后一列
> xl3_5 
  学号 姓名 性别 班级 面试 笔试 总成绩   bz
1  001 张三   男 一班   86   80   84.2 合格
2  002 李四   男 二班   78   87   80.7 合格
3  003 王五   女 二班   90   90   90.0 优秀
4  004 赵六   女 一班   68   78   71.0 合格
5  005 韩七   男 二班   90   90   90.0 优秀
> xl3_6 <- cbind(xl3_5[,1:4], c("java","python","R","mysql","oracle"),xl3_5[,5:ncol(xl3_5)]); # 在xl3数据框的第3列增加一列,注意命名,由于没有提前给新增数据命名,那对于数据框来说就会使用所有向量来构成一个列名
> xl3_6
  学号 姓名 性别 班级 c("java", "python", "R", "mysql", "oracle") 面试 笔试
1  001 张三   男 一班                                        java   86   80
2  002 李四   男 二班                                      python   78   87
3  003 王五   女 二班                                           R   90   90
4  004 赵六   女 一班                                       mysql   68   78
5  005 韩七   男 二班                                      oracle   90   90
  总成绩   bz
1   84.2 合格
2   80.7 合格
3   90.0 优秀
4   71.0 合格
5   90.0 优秀
> names(xl3_6) <- c("学号","姓名","性别","班级","专业","笔试","面试","总成绩","备注") # names()函数来指定列名
> xl3_6
  学号 姓名 性别 班级   专业 笔试 面试 总成绩 备注
1  001 张三   男 一班   java   86   80   84.2 合格
2  002 李四   男 二班 python   78   87   80.7 合格
3  003 王五   女 二班      R   90   90   90.0 优秀
4  004 赵六   女 一班  mysql   68   78   71.0 合格
5  005 韩七   男 二班 oracle   90   90   90.0 优秀

后续会对数据框做进一步的介绍,比如数据通过flextable包对数据框进行美化,设置边框、格式、背景等。对于其他的数据类型:数组,列表这里不再详细介绍,可以参考资料进行自我学习。

2.3 数据输入

  • 对于R来说,我们除了通过在命令窗口直接输入我们需要的数据外,我们还可以通过其他方式来讲数据导入到R,然后做进一步数据处理分析。

2.3.1 键盘输入

  • R自带文本编辑器 edit()函数
> data01 <- data.frame(id = numeric(0), name = character(0), sex = character(0)); #创建一个数据框,里面含3个变量指定对应的类型
> data01 <- edit(data01) # 此时调用文件编辑器,输入数据保存即可 ,等价于fix(data01)
> data01
  id name sex
1  1 张三  男
2  2 李四  男
3  3 王五  女
# 也可以直接在程序中嵌入数据,注意换行
> data001 <- "id age name 
+ 1 20 李四
+ 2 20 王五
+ 3 22 ll"
> mydata <- read.table(header=TRUE,text=data001) # 通过read.table()处理字符串并返回数据框
> mydata
  id age name
1  1  20 李四
2  2  20 王五
3  3  22   ll

在这里插入图片描述

2.3.1 Excel导入

> library(readxl);
> library(xlsx);
> T01 <- read_excel("E:\\学习\\text.xls",sheet=3,col_names=TRUE) ;#读取第一个sheet , col_names表示含表头
> data01 <- read_xls("e:\\学习\\text.xls",2) #2 表示读取第二个sheet
> data01
# A tibble: 5 x 3
  学号  面试  笔试 
  <chr> <chr> <chr>
1 001   86    80   
2 002   78    87   
3 003   90    90   
4 004   68    78   
5 005   90    90  
# 由上可知 面试,笔试都是字符类型,因此我们在导入数据时,可以通过col_type=c("text","numeric","numeric")来指定对应每列的数据类型,不然后面涉及计算则会报错,也可以通过as.numeric()函数进行转化

在这里插入图片描述

2.3.2 访问数据库管理系统

  • ODBC接口: ODBC一般指开放数据库互连,R 也可以连接到任何一种拥有ODBC驱动的数据库。前提是我们的电脑装有对应数据库以及对应的ODBC驱动,下面以我电脑mysql5.7以及mysql ODBC8.0 展开讲解。

  • 配置ODBC: 控制面板\系统和安全\管理工具\ODBC 数据源(64 位) 这里我以64位为例,具体配置如下,最后选择需要连接是数据库(以mysql自带的world数据库为例),注意设置字符集,不然查询出来的中文会出现乱码。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 安装RODBC包: 具体函数如下

odbcConnect(“dsn”,uid="",pwd="") 建立一个到ODBC数据库的连接
sqlFetch(channel,sqltable) 读取ODBC数据库中的某个表到一个数据框中
sqlQuery(channel,query) 向ODBC数据库提交一个查询并返回结果
sqlSave(channel,mydf,tablename=
sqtable,append=FALSE)
将数据框写入或更新(append=TRUE)到ODBC数据库的
某个表中
sqlDrop(channel,sqtable) 删除ODBC数据库中的某个表
close(channel) 关闭连接

> library(RODBC)
> mycoon <- odbcConnect("world",uid = "root", pwd = "root") # 建立一个数据库连接,ODBC配置中数据源名称为 world,将该连接赋值给mycoon,后面可以直接调用mycoon
> sqlTables(mycoon) #列出该连接下所有的数据表
  TABLE_CAT TABLE_SCHEM      TABLE_NAME TABLE_TYPE REMARKS
1     world                        city      TABLE        
2     world                     country      TABLE        
3     world             countrylanguage      TABLE        
4     world                      t_user      TABLE        
5     world                     t_user1      TABLE 
> data01 <- sqlFetch(mycoon, "city") #读取ODBC数据库中的某个表到一个数据框中,注意mycoon连接的是world数据库,若表不存在则报错
> data02 <- sqlQuery(mycoon,"select * from city") #通过sqlQuery()函数来调用sql语句,将结果返回给某个数据框
> colse(mycoon) #关闭连接

2.4 数据对象函数

  • R中不同的包中都有不同的函数,对数据处理的函数,对数据框处理的函数,对图形处理的函数等等。下面总结一下常用的数据对象处理函数

length(object) 显示对象中元素/成分的数量
dim(object) 显示某个对象的维度
str(object) 显示某个对象的结构
class(object) 显示某个对象的类或类型
mode(object) 显示某个对象的模式
names(object) 显示某对象中各成分的名称
c(object, object,…) 将对象合并入一个向量
cbind(object, object, …) 按列合并对象
rbind(object, object, …) 按行合并对象
Object 输出某个对象
head(object) 列出某个对象的开始部分(数据框前6行)
tail(object) 列出某个对象的最后部分(数据框后6行)
ls() 显示当前的对象列表
rm(object, object, …) 删除一个或更多个对象。语句rm(list = ls())将删除当前工作环境中的几乎所有对象*
newobject <- edit(object) 编辑对象并另存为newobject
fix(object) 直接编辑对象

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值