查看原文
其他

将军笔记之创建数据集

2017-07-25 coco 生信菜鸟团

好奇心是强劲的智慧的最永久的特性之一。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指定列数,byrow TRUE或FALSE确定是按行排列还是按列排列(默认按列),dimnames指定行名和列名,行名和列名分别用向量表示。举例(Ctrl + L可以清屏):如下图所示:创建矩阵所用元素为向量cells中的元素。创建的是2x2的矩阵,按行排列元素。行名、列名已提前在向量rnmes和cnmes中规定好了,用的时候将两个向量变成一个list赋值给dimnames。(2017/04/12 20:08 矩阵从向量来。指定行名列名要用列表


矩阵的创建

    • 矩阵中元素的引用:

      • x[2,]第二行

      • x[,2]第二列

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

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

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

  • 2017/03/15 21: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,]。注意没有逗号的时候默认是选择的列。(2017/04/12 20: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()函数改写如下:( 2017/04/12 20: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) 实例标识符( 2017/04/12 20: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中某个对象的信息(2017/04/12 21:13 注意这里的str是structure,不是string);信息显示diabetes是个factor,而status是个Ord.factor。在summary返回的信息中,不同类型的变量得到了不同的处理,这就是指定因子的意义所在。


列表:

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

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

  • 举个大栗子:

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

    • 如图中所示,列表的创建如上所说,没啥可再说的。列表元素的获取可以通过两种方式进行:一是索引号,二是题目。不管索引号还是题目都放在双方括号中( 2017/04/12 21:15 访问列表元素要用双方括号来索引,题目需要用双引号围起来。题目的使用不影响索引号,比如列表中的第二个元素,虽然加了ages这个题目,但是索引号依然是2。( 2017/04/12 21: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) 出现如图所示的界面,即可编辑数据(2017/04/12 21: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用于指定表示行标识符的变量( 2017/04/12 21: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是文件中的一个工作表。从文件句柄中获取一个工作表,赋值 51 29945 51 15290 0 0 3532 0 0:00:08 0:00:04 0:00:04 3531mydataframe

        • 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 * from Punishment") 使用查询语句对mydsn数据库进行查询,并以数据框形式返回给pundat

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

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

        • close(channel) 关闭连接

标注数据集:

  • 为变量名添加描述性标签

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

    • names(patientdata)[2] <- "Age at hospitalization (in years)" 把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()) 除以点号开头的隐藏对象外,其他对象全部删除。




100 29945 100 29945 0 0 6494 0 0:00:04 0:00:04 --:--:-- 6882 * Connection #0 to host 37.48.118.90 left intact

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存