第2章 创建数据集

1、R中的数据集&数据结构

  1. 数据集:由数据构成的一个矩形数组,行表示观测,列表示变量
    例子:对于一个班级学生信息的数据集,行代表每个学生,作为一个观测;列可能包括学号、身高、体重、GPA等多个维度的变量,反映一个观测的多个不同属性。

  2. 数据结构
    R中用于存储数据的对象类型:标量,向量,矩阵,数组,数据框,列表
    R中的数据结构
    术语解释

  • [ 对象(object)]是指可以赋值给变量的任何事物,包括常量、 数据结构、函数、图形等。对象都拥有某种模式,描述了对象的存储方式或处理方式(如函数print)。
  • 数据框(data frame):列表示变量,行表示观测,同一个数据框中可以存储不同类型的变量(如数值型,字符型),数据框是数据集存储的主要数据结构。
  • 因子(factor):名义型变量或有序型变量。
  • 向量:是用于存储数值型、字符型或逻辑型数据的一维数组。可以使用函数c()(具有组合功能)创建向量。
a<-c(1,2,5,3,6,-2,4) #数值型
b<-c("one","two","three")#字符型
c<-c(TRUE,FALSE,TRUE,FALSE,FALSE)#逻辑型

【注意】
单个向量中的数据必须具有相同的类型或模式(如数值型,字符型,逻辑型)。也即同一向量不能混杂不同模式的数据。
标量是含有一个元素的向量。如:f<-‘us’
使用方括号索引可以访问向量中的元素,其中第一个元素的下表是1而不是0

a<-c(1,2,5,3,6,-2,4)
a[3]#5
a[c(1,3,5)]#1,5,6
a[2:6]#2,5,3,6,-2
  • 矩阵:二维数组,每个元素都有相同的模式(可以是数值型,字符型或逻辑型)。创建函数matrix()
mymatrix<-matrix(vector,nrow=number_of_rows,ncol=number_of_columns,byrow=logical_value,dimnames=list(char_vector_rownames,char_vector_colnames))
# vector中含有矩阵的元素,nrow和ncol指定矩阵行和列的维数,dimnames是可选的以字符型**向量**表示的行名和列名,byrow选项表示矩阵应当按行填充(byrow=TRUE)或按列填充(默认情况,byrow=FALSE)

矩阵下标使用:使用下标和方括号来选择矩阵中的行、列或元素。x[i,]矩阵x的第i行;x[,j]矩阵x的第j列;x[i,j]矩阵的第i行第j列的元素。当选择多行或多列时,下标i,j可以为数值型向量。
矩阵与向量类似,也只能包含一种数据类型。

  • 数组(array):与矩阵类似,位数大于2。通过函数array()创建
myarray<-array(vector,dimensions,dimnames)
#vector包含数组中的数据
#dimensions是数值型向量,给出个维度下标的最大值
#dimnames是可选的、各维度名称标签的列表

数组是矩阵的一个自然推广,数组中的数据也只能具有一种模式

  • 数据框:不同列可以包含不同模式的数据(如数值型 字符型)。可通过函数data.frame()创建。
mydata<-data.frame(col1,col2,col3,……)
#列向量col1,col2,col3,……可以为任何类型(如字符型,数值型,逻辑型,不过每一列的数据模式必定是同种类型)
#每一列的名称可以由函数names指定

作业:创建一个学生信息的数据框

student_id<-c(17001,17002,17003,17004,17005)
name<-c("Mary","Bob","Jack","Tom","Jeny")
gender<-c('F','M','M','M','F')
GPA<-c(3.93,3.42,3.56,2.85,3.74)
student_frame<-data.frame(student_id,name,gender,GPA)
#选取数据框元素的方法:下标选取列(单列,或向量多列,或切片多列);直接指定列名
student_frame[1:2]
student_frame[c("gender","name")]
student_frame$gender
#$符号可用于选取一个给定数据框中的某个特定变量(列)
#也可用于生成两个变量的列联表:使用table()函数
table(student_frame$gender,student_frame$GPA)

运行结果
简化代码:函数attach()与detach()
函数attach():将数据框添加到R的搜索路径中,当R遇到一个变量时会搜索路径中的数据框对这个变量进行定位。相当于“绑定”某数据框。
函数detach():将数据框从搜索路径中移除,不会对数据做任何处理。相当于“解绑”。
函数with():仅有大括号内的语句都针对数据框执行,相当于“临时绑定”,局限性在于赋值仅在此函数的括号内生效。

attach(student_frame)
summary(GPA)
plot(student_id,GPA)
detach(student_frame)
#优点:不需要总是在变量前加上student_frame$的形式标记,直接写变量名即可
#局限性:当数据框被绑定前,环境中已经有名称相同的对象时,原始对象将取得优先权

with(student_frame,summary(GPA),plot(student_id,GPA))
#如果要创建在with结构之外都存在的对象,使用<<-代替<-作为赋值符,可将对象保存在with之外的全局环境中

实例标识符(case identifier):可以通过数据框操作函数中的row.names选项指定。

student_frame<data.frame(student_id,name,gender,GPA,row.names=student_id)

结果-修改行名

  • 因子(factor):使用函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1,……k](k是名义型变量中唯一值的个数),一个由字符串组成的原始向量将一一映射到这组数字上。
    变量类型和因子
    表示有序型变量,需要在函数factor()中指定参数ordered=TRUE
grade<-c('bad','middle','good','excellent')
rank<-factor(grade,ordered=TRUE)
#对于字符型向量,因子水平(比如1,2,3,4)将默认依据字母顺序创建,但这与实际的逻辑/意义顺序未必一致,可通过指定参数levels选项来覆盖默认排序
rank<-factor(grade,ordered=TRUE,levels=c("bad","middle","good","excellent"))

str():可以显示对象的结构
summary():显示对象的统计概要

patientID<-c(1,2,3,4)
age<-c(25,34,28,52)
diabetes<-c("type1","type2","type1","type1")
status<-c("poor","improved","excellent","poor")
diabetes<-factor(diabetes) #无序因子,分类/名义变量
status<-factor(status,order=TRUE) #有序因子
patientdata<-data.frame(patientID,age,diabetes,status)
str(patientdata)#显示对象patientdata的结构
summary(patientdata)#显示对象的统计摘要

结果-因子&有序因子
统计摘要

  • 列表(list):是一些对象或成分(component)的有序结合。允许整合若干(可能无关的)对象到单个对象名下,可包含若干向量、矩阵 数据框 等,也可以嵌套自身(列表)。使用函数list()创建
mylist<-list(object1,object2,……)
#object可以是学习过的任何对象
#也可以为列表对象命名
mylist<-list(name1=object1,name2=object2,……)
#可以组合任意多的对象,将它们组合成一个列表

列表是R中重要的数据结构:
①列表允许以一种简单的方式组织和重新调用不相干的信息
②许多R函数的运行结果都是以列表的形式返回的
【注意】
R不提供多行注释或块注释功能,只能以#开始每一行的注释,类似于matlab(这一点)
将一个值赋给某个向量、矩阵、数组或列表中一个不存在的元素下标时,R将扩展这个数据结构以容纳新值(这一点与python不同,在python中会报错)
R中没有标量,标量作为单元素向量形式出现。
R中下标不是从0开始,而是从1开始(这一点与python中也不同)
R中变量无法被生命,在初次复制时被生成(这一点与python相同,也是变量引用对象的方式吗?)

2、数据输入

键盘输入:使用函数edit()

  • 步骤1:创建一个空数据框(或矩阵),其中变量名和变量的模式需要与理想中的最终数据集一致
  • 步骤2:针对该数据对象调用文本编辑器,输入数据将结果保存到此数据对象
    适用于小数据集
mydata <- data.frame(age=numeric(0),gender=character(0),weight=numeric(0))
mydata <- edit(mydata)
fix(mydata)
# 上面两行代码是等价的
# 函数edit()事实上是在对象的一个副本上进行操作需要重新赋值给目标才会保存修改
# fix()可以达到同样下过

从带分隔符的文本文件中导入数据:使用函数read.table(),这个函数可以读入一个表格形式的文件(如后缀名为.csv的文件)并将其保存为一个数据框

mydataframe<-read.table(file,header=logical_value,sep="delimiter",row.names="name")
#file是一个带分隔符的ASCII文本文件,header是一个**表明首行是否包含了变量名的逻辑值**
#sep是用来指定分隔数据的分隔符,默认为sep=" ",即可为一个或多个空格、制表符、换行符或回车符
# row.names是一个可选参数,用于指定一个或多个表示行标识符的变量

默认情况下,字符型变量将转换为因子。禁止这种转换行为的方法有:
①设置参数选项stringAsFactors=FALSE
② 使用选项colClasses为每一列指定一个类,如逻辑型logical,数值型numeric,字符型character,因子factor

导入excel数据
方法1-将excel文件导出为一个逗号分隔文件(csv),用上文方式导入
方法2-使用RODBC包访问excel文件,电子表格的第一行应该包含变量/列的名称
注意!经常忘记关闭EODBC,会报错

library(RODBC)
#不能使用odbcConnectExcel(),因为不支持32位windows系统,可改用**odbcConnectExcel2007()**
#channel是一个odbcConnectExcel2007()返回的RODBC连接对象
#“sheet”是工作簿中要读取的那个工作表的名称,返回的dataframe2是数据框
odbcClose(channel) #用完之后要关闭

方法

方法3-使用xlsx包,read.xlsx(file,n)导入xlsx/excel工作表(file是文件工作簿所在路径,n为要导入的工作表序号)

library(xlsx)
workbook<-"filename" #可包含路径(如果文件并不在R的当前工作搜索路径下的话)
mydataframe<-read.xlsx(workbook,1) #1是指要导入的工作表序号为1

从网页抓取数据
相对复杂,可从官网查看

导入SPSS数据:通过foreign包(默认安装)中的函数read.spss()导入R;或使用Hmisc包(可下载安装)中的函数spss.get(),这个函数是对read.spss()的一个封装

install.packages("Hmisc")
library(Hmisc)
mydataframe<-spss.get("data.sav",use.value.labels=TRUE)
#use.value.labels=TRUE:让函数将带有值标签的变量导入为R中水平对应相同的因子

ps.还有其他几种导入数据源的方法,一般不常用,用到可学习

访问数据库管理系统
R中有多种面向关系型数据库管理系统(DBMS)的接口(如MySQL,Oracle,SQLite等)
1)ODBC接口:通过RODBC包访问一个数据库。
安装配置合适的ODBC驱动(匹配系统和数据库类型);安装RODBC包
RODBC包中的主要函数
函数sqlQuery()功能很强大:可以插入任意有效的SQL语句

#应用举例
library(RODBC) #载入RODBC包
myconn<-odbcConnect("mydsn",uid="bob",pwd="wwyyjy") #连接到一个数据源mydsn(已注册,有用户名和登录密码)
crimedat<-sqlFetch(myconn,Crime) #将Crime表复制到crimedat数据框中
pundat<-sqlQuery(myconn,"select * from Punishment")
#对punishment表执行SQL语句select,将结果保存在pundat中
close(myconn)#关闭连接

3、数据集标注

  • 变量标签:为变量名添加描述性标签(一般比变量名更长更详细)
    names(dataframe)会输出数据框的变量名
    可以用标签取代变量名,之后使用位置下标来访问这个变量,但此方法并不理想

  • 值标签:为类别型变量中的编码添加值标签
    函数factor()可以为类别型变量创建值标签

studentdata$gender<-factor(studentdata$gender,levels=c(1,2),labels=c("male","female"))
#levels:变量的实际值
#labels:包含理想值标签的字符型向量

4、处理数据对象的实用函数

R中常用/实用的数据对象处理函数:
p1
p2
函数head()与函数tail()可以用于快速浏览大数据集的结构

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值