将军笔记之创建数据集

好奇心是强劲的智慧的最永久的特性之一。by山·约翰逊

今天走的是清凉夏日风~~~

数据集:由数据构成的矩形数组,行表示观测,列表示变量(观测-变量;记录-字段;示例-属性)

R中的数据结构:标量,向量,数组,数据框,列表;

R中的数据类型:数值,字符,逻辑,复数,原生(字节)(数据类型和数据结构要分清)

实例标识符,日期数据,名义型和有序性变量;R将实例标识符称为rowname,将类别型变量称为因子。(看起来,实例标识符的意思就是行名,应该对应MySQL中的键)

R中的数据结构包括标量,向量,矩阵,数组,数据框,列表;

数据框:列表示变量,行表示观测,是用来存储数据集的主要数据结构;

因子(factor)是名义型变量或有序型变量。

矩阵和数据框的区别,可能在于矩阵中的数据都是同一种类型,而数据框中的数据各列可以是不同类型。

向量:

存储数值型,字符型,逻辑型数据的一位数组,可以用c()创建。单个向量中的数据必须是相同类型的;

访问向量中元素的方法:

a[c(2,4)]

a[3]

a[c(1,3,5)]

a[2:6]

冒号的用法:a-c(2:6)等价于a-c(2,3,4,5,6)(其实不加c()也行啊,就直接写a-2:6)

矩阵:

二维数组,元素拥有相同模式(数值型,字符型,逻辑型),用matrix创建。

mymatrix-matrix(vector,nrow=number_of_row,ncol=number_of_columns,byrow=logical_value,dimnames=list(rownames,colnames))将一个向量(第一个参数vector)转换成矩阵,nrow指定行数,ncol指定列数,byrowTRUE或FALSE确定是按行排列还是按列排列(默认按列),dimnames指定行名和列名,行名和列名分别用向量表示。举例(Ctrl+L可以清屏):如下图所示:创建矩阵所用元素为向量cells中的元素。创建的是2x2的矩阵,按行排列元素。行名、列名已提前在向量rnmes和cnmes中规定好了,用的时候将两个向量变成一个list赋值给dimnames。(/04/:08矩阵从向量来。指定行名列名要用列表)

矩阵的创建

矩阵中元素的引用:

x[2,]第二行

x[,2]第二列

x[1,4]第一行第四列的元素

x[1,c(4,5)]第一行,第四第五个元素

维度超过2时,使用数组(这个后面用得很少啊...是因为维度很少超过2吗?);有多种模式的数据时,使用数据框。

/03/:40数组

数组用array函数创建:myarray-array(vector,dimensions,dimnames),其中第二个参数dimensions是维度,是一个数值型向量;第三个参数dimnames是各维的名字,是个列表。举个栗子:

列表的创建

注意dimnames是个关键词。维度用c()函数做成向量,各维名称用list做成列表。

数组是矩阵的推广,其中的元素只能是一种模式。取元素方式与矩阵相同,如Z[1,2,5],第一个矩阵第二行第五列。

数据框

数据框可通过函数data.frame()创建:mydataframe-data.frame(col1,col2,col3,...);每一列的名称可由names函数指定。再举个栗子:

数据框的创建

可以看到,数据框,就是把几个向量用data.frame()函数结合到了一起。注意产生的数据框已经自动加上了列名,列名即是结合的向量的名字。每一列只能有一种数据模式,但是不同列的数据模式可以不一样。

数据框中元素的选择,可以用下标记号,也可以用列名,如patientdata[1:2],选了数据框第一列和第二列;而patientdata[1,2]选的是第一行第二列的元素;要选第一行第二行怎么办呢?那就是patientdata[1:2,]。注意没有逗号的时候默认是选择的列。(/04/:20以后用的时候把逗号都加上吧。)

当然也可以使用列名来选取元素:patientdata[c("diabetes","status")]。

还有一种新的表示方法:patientdata$age,选取数据框patientdata中age这一列。

上述描述的例子如下图所示:

从数据框中选取元素

生成两个变量的列联表(注意这个列联表和统计中的列联表是一个意思,就是符合条件的个体数),可以这样写:table(patientdata$disbetes,patientdata$status),table()函数生成两个参数的列联表,得到符合两个条件交叉的个体数量。如下图所示:

从数据框中生成列联表

attach(),detach(),with()

attach()可将数据框添加到R的搜索路径中。R在遇到一个变量名后,将检查搜索路径中的数据框,以定位到这个变量。举个栗子:

summary(mtcars$mpg)(生成四分位数及均值)

plot(mtcars$mpg,mtcars$disp)

plot(mtcars$mpg,mtcars$wt)等价于下列代码:

attach(mtcars)

summary(mpg)

plot(mpg,disp)

plot(mpg,wt)

detach(mtcars)注意用完后别忘再把变量从搜索路径中请出来,以免后面有麻烦。

如果数据框中的变量与数据框外的变量同名,则attach(dataframe)会把数据框外的变量保留下来放在数据框中,即原有对象优先(而不是覆盖)。注意这一点,有点反逻辑。

上面的栗子用with()函数改写如下:(/04/:27模式:with(dataset,{statements}))

with(mtcars,{

summary(mpg,disp,wt)

plot(mpg,disp)

plot(mpg,wt)

})大括号之间的语句都针对数据框mtcars执行。大括号内赋值的变量,仅在大括号内有效。如果要让大括号内赋值的变量在大括号外有效的话,需要使用-这个符号赋值。

指定实例标识符:

在创建数据框时指定:patientdata-data.frame(patientID,age,diabetes,status,row.names=patientID)实例标识符(/04/:28这里的实例标识符相当于MySQL中的key吧?),看起来就类似于SQL中的键(注意,书上写错了,这里一定要是row.names。如果用其他的,不会报错,但是会创建一个新列列名就是等号左边的字符。如图所示)

在创建数据框时用"row.names=patientID"指定实例标识符。注意一定要是row.names。另外其他写法会增加一列。

因子:其实就是定类和定序类型的变量(也就是分类变量)。

函数factor()以一个整数向量的形式存储类别值,取值范围是[1-k],k是变量中唯一值的个数。

举个栗子:

diabetes-c("Type1","Type2","Type1","Type1")

diabetes-factor(diabetes)将此向量存储为(1,2,1,1),并在内部关联1=Type1,2=Type2(注意了注意了!复制顺序是根据字母顺序定的!)

(上面说的只是factor的工作原理。实际上得到的因子化的变量的值和没有因子化的变量的值是一样的,只是类型变了,也就是说R对待它们的方式变了。对于人来说,看到的内容是一样的)

有序变量的话,需要加ordered=TRUE选项。

再举个栗子:

status-c("Poor","Improved","Excellent","Poor")

status-factor(status,ordered=TRUE)

注意了注意了!!这里ordered=TURE只是告诉R,这个变量是个等级变量,但是没有规定等级的顺序!等级顺序是默认按字母顺序排列的。要想按照自己想要的顺序排列,需要使用levels选项:status-factor(status,ordered=TRUE,levels=c("Poor","Improved","Excellent"))在数据中出现而在这里levels中没有列举的元素,将全部被视为缺失值。

举个大栗子:

因子的使用

如图中所示,大部分内容都在前面提到过了。str(object)可提供R中某个对象的信息(/04/:13注意这里的str是structure,不是string);信息显示diabetes是个factor,而status是个Ord.factor。在summary返回的信息中,不同类型的变量得到了不同的处理,这就是指定因子的意义所在。

列表:

用list()创建列表:mylist-list(object1,object2,...)

还可以为列表中的每个对象取名字:mylist-list(name1=object1,name2=object2,...)

举个大栗子:

列表的创建与列表元素的获取

如图中所示,列表的创建如上所说,没啥可再说的。列表元素的获取可以通过两种方式进行:一是索引号,二是题目。不管索引号还是题目都放在双方括号中(/04/:15访问列表元素要用双方括号来索引),题目需要用双引号围起来。题目的使用不影响索引号,比如列表中的第二个元素,虽然加了ages这个题目,但是索引号依然是2。(/04/:16再再再次说明R中的list很像python中的字典)

一些注意事项:

R中没有多行注释,每行前面都要加#。但是可以用if(FALSE){...}这样的方式来使大括号内的语句不执行。(所有的语言都可以这么搞吧?)

如果赋值位置超过了索引号,变量将自动扩展以容纳新值。如下图所示:x只有3个元素,当要给x的第七个元素赋值时,R自动将x中元素数扩展到7,多出来的元素用NA补齐。注意R中元素索引是从1开始而不是从0开始

赋值范围超过了变量范围

R中没有标量,标量以单元素向量的形式出现;

数据的输入:

使用键盘输入数据:

创建一个空的数据框:mydata-data.frame(age=numeric(0),gender=character(0),weight=numeric(0))

编辑数据:mydata-edit(mydata)出现如图所示的界面,即可编辑数据(/04/:19注意先要创建一个空的数据框,然后再edit)。注意要赋值。edit()实际上是在副本上操作。

age=numeric(0)这个语句将创建一个指定模式但不含实际数据的变量

使用键盘输入数据

mydata-edit(mydata)等价于fix(mydata)注意使用fix()就不用赋值了。

从带分隔符的文本文件(比如CSV?)导入数据

mydataframe-read.table("file",header=logical_value,sep="delimiter",row.names="name")

file是ASCII文本文件,row.names用于指定表示行标识符的变量(/04/:21就是行名)。注意row.names指定某一变量为记录的键。

默认情况下,字符型变量将被转换为因子。设置选项stringsAsFactors=FALSE即可停止转换(有何必要停止这种转换?)。另外可以使用colClasses为每一列指定一个类。

函数file(),gzfile(),bzfile(),xzfile(),unz(),url()可作为文件名参数使用;用双引号围住的完整的URL也可以作为文件名参数使用。

导入Excel数据

另存为csv再用上面的方法导入;

用RODBC包来访问Excel文件:

install.packages("RODBC")

library(RODBC)

channel-odbcConnectExcel("myfile.xls")channel应该是个文件句柄。通过文件句柄访问。

mydataframe-sqlFetch(channel,"mysheet")mysheet是文件中的一个工作表。从文件句柄中获取一个工作表,赋值给mydataframe

odbcClose(channel)关闭文件句柄。

xlsx文件本质上是多个XML文件组成的压缩包。xlsx包可以用来读取这种类型的文件

library(xlsx)

workbook-"c:/myworkbook.xlsx"把字符串赋值给workbook

mydataframe-read.xlsx(workbook,1)打开c:/myworkbook.xlsx这个文件的第一个工作表,赋值给一个数据框。是的,read.xlsx()函数返回一个数据框。

(好难记啊...现用现查吧...)

导入SPSS中的数据:

install.packages("Hmisc")

library(Hmisc)

mydataframe-spss.get("mydata.sav",use.value.labels=TRUE)其中use.value.labels=TRUE表示让函数将带有值标签的变量导入为R中水平对应相同的因子。

访问数据库管理系统

要使用R访问数据库,首先需要很对数据库类型安装和配置合适的ODBC驱动。

安装RODBC包:install.packages("RODBC")

举个栗子:

library(RODBC)

myconn-odbcConnect("mydsn",uid="Rob",pwd="aardvark")通过用户名密码登录数据框mydsn,并建立连接。

crimedat-sqlFetch(myconn,Crime)通过连接myconn访问mydsn数据库,获取Crime这个表,以数据框形式返回给crimedat。

pundat-sqlQuery(myconn,"select*fromPunishment")使用查询语句对mydsn数据库进行查询,并以数据框形式返回给pundat

sqlSave(channel,tablename=sqtable,append=FALSE)将数据框写入到ODBC数据库的某个表中。如果append=TRUE,则为更新。

sqlDrop(channel,sqtable)删除ODBC数据框中的某个表

close(channel)关闭连接

标注数据集:

为变量名添加描述性标签

将变量标签作为变量名,然后通过位置下标来访问这个变量。费这个劲呀...

names(patientdata)[2]-"Ageathospitalization(inyears)"把names()应该是取一个数据框的变量名的意思,返回的应该是个向量。该赋值语句把其中第二个变量名改成了双引号中的内容。后面再需要引用这个变量时,就直接写patientdata[2]

为类别型变量中的编码添加值标签

举个栗子:名为gender的变量,1,2分别代表男,女,这时可以使用代码:

patientdata$gender-factor(patientdata$gender,levels=c(1,2),labels=c("male","female"))意思是,把数据框patientdata中的变量gender转换为因子,有两个水平,1和2;对应的标签分别是:male和female。(这里labels中的参数必须得是gender原有的值吧?要不然知道把谁对应为1把谁对应为2啊?)

几个常用函数:

length(object)  显示对象中的元素/成分数量

dim(object)  显示对象维度

str(object)  显示对象结构

class(object)  显示对象的类或类型

mode()  显示对象的模式(这是什么意思?)

names()  显示对象中个成分名称(还可以修改名称,如上例所示)

cbind(object1,object2,...)  按列合并对象(把待合并对象一列一列排起来)

rbind(object1,object2,...)  按行合并对象(把待合并对象一行一行排起来)

head(object)  列出对象的开始部分

tail(object)  列出对象的最后部分

ls()  列出当前的对象列表

rm(list=ls())  除以点号开头的隐藏对象外,其他对象全部删除。

赞赏

长按







































武汉权威的白癜风医院
武汉治白癜风最好的医院



转载请注明:http://www.92nongye.com/tlfc/tlfc/204619482.html