R语言学习1:基本数据类型,文件读取

本系列是一个新的系列,在此系列中,我将和大家共同学习R语言。由于我对R语言的了解也甚少,所以本系列更多以一个学习者的视角来完成。

参考教材:《R语言实战》第二版(Robert I.Kabacoff),书中所提到的John Cook的优秀博文,关于代码规范的《来自Google的R语言编码风格指南》。

Part 1:基本数据类型

Unit 1:向量、矩阵与数组

向量:用于存储数值型、字符型或逻辑型数据的一维数组,使用c()创建。

  • 单个向量中的数据必须拥有相同的类型或模式(数值、字符或逻辑)。
  • 标量是只含一个元素的向量,R中不存在一般意义上的标量。
  • 向量的方括号中可以放置一个整数向量作为索引。
  • R语言中,向量的索引从1开始,负数索引不表示倒数,而表示补集。有关更多索引的知识点,参阅Five kinds of subscripts in R

矩阵:每个元素都拥有相同的模式的二维数组,可通过matrix()创建。

mymatrix <- matrix(vector, nrow, ncol, byrow, dimnames)
  • matrix()的第一个参数是vector,包含了矩阵的元素。
  • nrowncol用来指定行数和列数。
  • byrow=FALSE指定矩阵的填充模式是按行还是按列,默认是按列的
  • dimnames可以接受一个二元列表dimnames[[1]]是行名,dimnames[[2]]是列名,都是字符型向量。
  • 对矩阵的索引中方括号包含逗号分割的两个参数,x[i, ]表示第i行,x[, j]表示第j列,x[i, j]表示第i行第j列。逗号两边的参数可以用数值列表,来表示多行多列。

数组:与矩阵类似,但维数可以大于2,可通过array()创建。

myarray <- array(vector, dimensions, dimnames)
  • dimensions是一个数值向量,给出各个维度的最大下标
  • dimnames是一个和dimensions等长的字符型列表,给出各个维度的名字,每个列表元素是一个与dimensions对应位置等长对应的字符串向量。

Unit 2:数据框、因子

数据框:可以包含不同模式的数据,是R中最常处理的数据类型,用data.frame()创建。

mydata <- data.frame(col1, col2, col3, ...)
  • 数据框中,每一个col是列向量,它们的数据类型相同。

  • 每一列的名称可以由函数names()指定,用法为names(mydata) <- ...

  • 也可以在赋值时直接给列命名,如

    mydata <- data.frame(
        C1 = col1,
        C2 = col2,
        C3 = col3
    )
    

    这里使用的是=而不是<-

  • 数据框可以看成矩阵的推广,但是矩阵索引逗号是必须的,数据框却可以不加逗号,此时的数值索引代表列索引,如果要表示第i行,应该使用mydata[i, ]

  • $符号可以用来访问数据框中的某一列。

为了简化代码,可以使用attach()detach()with()函数。

  • 函数attach()将数据框添加到R的搜索路径中,detach()则将数据框从搜索路径移除。

  • 函数with()可以创建一个针对数据框的环境,用法是

    with(mydata, {
        print(summary(C1))
        plot(C1, C4)
    })
    
  • 使用with()函数时,赋值仅在with环境中生效。如果要创建全局变量,则应使用特殊赋值符<<-替代标准赋值符<-

实例标识符:实例标识符指的是数据库中的主键,在R中,可以通过row.names()函数来指定,也可以在创建数据框时直接用row.names参数指定。

patientID <- c(1, 2, 3, 4)
age <- c(25, 34, 28, 52)
diabetes <- c("Type1", "Type2", "Type1", "Type2")
status <- c("Poor", "Improved", "Excellent", "Poor")
patientdata <- data.frame(patientID, age, diabetes, status)
row.names(patientdata) <- patientID

对于数据框,可以用str()函数来显示其结构,用summary()函数来显示其统计概要

名义变量和有序变量在R中称为因子,函数factor()以一个整数向量的形式存储类别值,整数的范围是\([1, k]\)\(k\)是名义变量中唯一值的个数,同时由一个字符串组成的内部向量将映射到这些整数上

如果有向量diabetes <- c("Type1", "Type2", "Type1", "Type1"),则以下语句:

diabetes <- factor(diabetes)

可以将其储存为(1, 2, 1, 1),并在内部将其映射为1 = Type12 = Type2

要表示有序型变量,需要将factor()函数的order属性指明为TRUE,并用levels属性指定其因子排序(如果不指定,则按照字典序排列,一般情况下这不好)。

数值型变量可以用levelslabels参数来编码成因子。

如果有向量sex <- c(1, 2, 1, 1),则以下语句:

sex <- factor(sex, levels=c(1, 2), labels=c("Male", "Female"))

可以将其转化为因子c("Male, "Female", "Male", "Male"),并且所有不是1, 2的值将被转化为缺失值

Unit 3:列表

列表是一些对象的有序集合,且这些对象之间可以是毫不相关的,用list()函数创建一个列表。

mylist1 <- list(object1, object2, ...)

mylist2 <- list(name1=object1, name2=object2, ...)

g <- "My First List"
h <- c(25, 26, 18, 39)
j <- matrix(1:10, nrow=5)
k <- c("one", "two", "three")
mylist3 <- list(title=g, ages=h, j, k)
  • 列表的访问用双重方括号,其中可以是数字索引,也可以是字符串表示的名字(需引号)。
  • 列表的访问可以用$符号,这样访问变量名不需要用引号。
  • 许多R函数的运行结果都以列表的形式返回。

Part 2:数据的输入

参考链接:《R数据的导入和导出》。

R语言拥有内置的文本编辑器,这使得手动输入数据十分方便。在R中,edit()可以调用这个文本编辑器,并且在关闭文本编辑器后返回一个副本。

mydata <- data.frame(age=numeric(0), gender=character(0), weight=numeric(0))
mydata <- edit(mydata)  # 弹出文本编辑器

fix(mydata)  # 第二行的等价写法

除此外,我们常常会遇到较大的数据集,需要导入。请不要小看数据集的导入,在实际操作中导入可能会出现许多问题。

Unit 1:导入带分隔符的文本文件

这种文件类型主要指csv, tsv等,使用的函数是read.table(file, options)。这里file是文件路径,options是可选择的选项。

  • header:文件是否在第一行包含了变量名,如果是,需要设置成TRUE
  • sep:分隔符,默认为sep="",包含了空字符(一个或多个空格,回车,制表符)。除此外,常用的制定值有sep=","sep="\t"
  • row.names:指定行标记符。
  • col.names:如果header=FALSE,就可以用此参数指定一个包含变量名的字符向量。如果header=FALSE且没有指定col.names,则会自动命名为V1, V2, ...
  • na.strings:用于表示缺失值的字符向量。如na.strings=c("?"),就表示将读取到的"?"设置为NA
  • colClasses:可以为每一列指定数据类型,当读取大型文本文件时,可以可观提升处理速度。
  • quote:用于对有特殊字符的字符串划定界限的字符串,默认是单引号或双引号。
  • skip:读取数据前跳过的行的数目,适用于具有头注释的文本文件。
  • stringsAsFactors:标记字符向量是否需要转化为因子,默认是TRUE,除非被colClasses所覆盖。
  • text:一个指定文字进行处理的字符串,用来取代file(几乎不用,如果这样做为什么不直接使用edit()?)

比较常用的选项可能是skip(先看看是否有头注释)、header(再看看是否包含变量名)、sep(选择分界符,这要用文本编辑器观察一下以免被Excel欺骗)、col.names(是否需要自己指定变量名)、na.strings(是否需要处理缺失值)、stringsAsFactor(有时候不希望字符串被转化)。

Unit 2:导入Excel数据

导入Excel数据最简单的方式,是通过导出为CSV格式,再使用read.table()函数读取。也可以使用xlsx包中提供的read.xlsx()函数进行读取。

library(xlsx)
mydata <- read.xlsx(file, n)

这里file是工作路径,n是工作表的索引。除此外,read.xlsx还具有如下常用的可选参数:

  • rowIndex:一个可选的数值向量,指定需要读取的行号。如果不指定此参数,且下面的startRowendRow也不指定,则会读取所有的行。
  • startRow:当rowIndex缺省时生效,指定开始读取的行号(单个数值),适用于含有头注释的xlsx文件。
  • endRow:当rowIndex缺省时生效,指定结束读取的行号(单个数值)。
  • colIndex:一个可选的数值向量,指定需要读取的列号。如果不指定此参数则读取所有的列。
  • header:在需要读取的行号中,是否将第一行作为变量名。
  • colClasses:与read.table()函数中的一致。
  • encoding:如果表格中含有中文,则需要指定encoding='UTF-8'

尤其需要注意encoding参数,对于我们需要读取中文数据时十分有用。

Part 3:处理数据对象的函数

以下部分函数的实用性超乎我的想象,但是先前见到的R教程几乎没有提及。

  1. length(object):显示对象中元素的数量。
  2. dim(object):显示某个对象的各维度长度,即各个维度的下标上限。向量的维度显示为NULL(应该使用length()),数据框、矩阵、数组等维度将返回一个向量。
  3. str(object):显示某个对象的结构。
  4. class(object):显示某个对象的类或类型,如"numeric", "data.frame", "integer", "factor"
  5. mode(object):显示某个对象的模式,如"numeric", "list"。这不会给出data.frame, factor之类的返回,实际上我也不能很好地区分class()mode()
  6. names(object):显示对象中各成分的名称。
  7. c(object, object, ...):将对象合并成一个向量。
  8. cbind(object, object, ...):按列合并对象,适用于合并数据框。
  9. rbind(object, object, ...):按行合并对象。
  10. object:输出某个对象。
  11. head(object):列出某个对象的开始部分,可类比Pandas库。
  12. tail(object):列出某个对象的最后部分。
  13. ls()显示当前的对象列表。
  14. rm(object, object, ...):删除对象。有一句常用的清除几乎所有对象的语句是rm(list=ls())
  15. newobject <- edit(object):直观地编辑对象,并另存为newobject。如果没有赋值,编辑将不会生效。
  16. fix(object):直接编辑对象,不需要赋值。
posted @ 2021-02-08 18:12  江景景景页  阅读(1320)  评论(0编辑  收藏  举报