
本文共 5010 字,大约阅读时间需要 16 分钟。
本系列是一个新的系列,在此系列中,我将和大家共同学习R语言。由于我对R语言的了解也甚少,所以本系列更多以一个学习者的视角来完成。
参考教材:《R语言实战》第二版(Robert I.Kabacoff),书中所提到的,关于代码规范的《》。
Part 1:基本数据类型
Unit 1:向量、矩阵与数组
向量:用于存储数值型、字符型或逻辑型数据的一维数组,使用c()
创建。
- 单个向量中的数据必须拥有相同的类型或模式(数值、字符或逻辑)。
- 标量是只含一个元素的向量,R中不存在一般意义上的标量。
- 向量的方括号中可以放置一个整数向量作为索引。
- R语言中,向量的索引从1开始,负数索引不表示倒数,而表示补集。有关更多索引的知识点,参阅。
矩阵:每个元素都拥有相同的模式的二维数组,可通过matrix()
创建。
mymatrix <- matrix(vector, nrow, ncol, byrow, dimnames)
matrix()
的第一个参数是vector
,包含了矩阵的元素。nrow
、ncol
用来指定行数和列数。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 = Type1
和2 = Type2
。
要表示有序型变量,需要将factor()
函数的order
属性指明为TRUE
,并用levels
属性指定其因子排序(如果不指定,则按照字典序排列,一般情况下这不好)。
数值型变量可以用levels
和labels
参数来编码成因子。
如果有向量
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中,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
:一个可选的数值向量,指定需要读取的行号。如果不指定此参数,且下面的startRow
和endRow
也不指定,则会读取所有的行。startRow
:当rowIndex
缺省时生效,指定开始读取的行号(单个数值),适用于含有头注释的xlsx
文件。endRow
:当rowIndex
缺省时生效,指定结束读取的行号(单个数值)。colIndex
:一个可选的数值向量,指定需要读取的列号。如果不指定此参数则读取所有的列。header
:在需要读取的行号中,是否将第一行作为变量名。colClasses
:与read.table()
函数中的一致。encoding
:如果表格中含有中文,则需要指定encoding='UTF-8'
。
尤其需要注意encoding
参数,对于我们需要读取中文数据时十分有用。
Part 3:处理数据对象的函数
以下部分函数的实用性超乎我的想象,但是先前见到的R教程几乎没有提及。
length(object)
:显示对象中元素的数量。dim(object)
:显示某个对象的各维度长度,即各个维度的下标上限。向量的维度显示为NULL
(应该使用length()
),数据框、矩阵、数组等维度将返回一个向量。str(object)
:显示某个对象的结构。class(object)
:显示某个对象的类或类型,如"numeric", "data.frame", "integer", "factor"
。mode(object)
:显示某个对象的模式,如"numeric", "list"
。这不会给出data.frame, factor
之类的返回,实际上我也不能很好地区分class()
和mode()
。names(object)
:显示对象中各成分的名称。c(object, object, ...)
:将对象合并成一个向量。cbind(object, object, ...)
:按列合并对象,适用于合并数据框。rbind(object, object, ...)
:按行合并对象。object
:输出某个对象。head(object)
:列出某个对象的开始部分,可类比Pandas库。tail(object)
:列出某个对象的最后部分。ls()
显示当前的对象列表。rm(object, object, ...)
:删除对象。有一句常用的清除几乎所有对象的语句是rm(list=ls())
。newobject <- edit(object)
:直观地编辑对象,并另存为newobject
。如果没有赋值,编辑将不会生效。fix(object)
:直接编辑对象,不需要赋值。
发表评论
最新留言
关于作者
