# 对于同一个向量,只能是同一种类型
age <- c(1, 3, 5, 2, 11, 9, 3, 9, 12, 3); #数值型
sex <- c("男", "男", "女", "男", "女", "男"); # 字符型
pos <- c(TRUE, FALSE, TRUE, TRUE ,TRUE, FALSE); # 布尔型
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()
> 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包对数据框进行美化,设置边框、格式、背景等。对于其他的数据类型:数组,列表这里不再详细介绍,可以参考资料进行自我学习。
> 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
> 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()函数进行转化
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) #关闭连接
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) 直接编辑对象