在R中,变量可以保存所有的数据类型,比如标量、向量、矩阵、数据框、函数等。
R语言基本的数据类型有数值,逻辑型(TRUE,FALSE),文本(字符串)。
R语言数据结构包括向量,矩阵和数据框,多维数组,列表,对象等。最基本的是向量类型。
向量是将若干个基础类型相同的值存储在一起,各个元素可以按序号访问。如果将若干个数值存储在一起可以用序号访问,就叫做一个数值型向量。
用c() 函数把多个元素或向量组合成一个向量。
如 x = c(10,6,4,7,8)
length(x)可以求x的长度
numeric()函数可以用来初始化一个指定元素个数而元素都等于0的数值型向量,如numeric(10)会生成元素为10个0的向量。
R中四则运算用+ - * / ^(加、减、乘、除、乘方),%/%表示整除,%%表示求余
向量与标量的运算为每个元素与标量的运算,如
x <- c(1,10)
x + 2
## [1] 3 12
等长向量的运算为对应元素的两两运算
两个不等长向量的四则运算,如果其长度为倍数关系,规则是每次从头重复利用短的一个
R中的函数一般都是向量化的:在R中,如果普通的一元函数以向量为自变量,一般会对每个元素计算。这样的函数包括sqrt,log10,log,exp,sin,cos,tan等许多。
sqrt(c(1,4,6.25))
## [1] 1.0 2.0 2.5
sort(x)返回排序结果。rev(x)返回把各元素排列次序反转后的结果。order(x)返回排序用的下标。
x <- c(33, 55, 11)
sort(x)
## [1] 11 33 55
rev(sort(x))
## [1] 55 33 11
order(x)
## [1] 3 1 2
x[order(x)]
## [1] 11 33 55
sum(求和),mean(求平均值) ,var(求样本方差),sd(求样本标准差),min(求最小值),max(求最大值),range(求最小值和最大值)等函数称为统计函数,把输入向量看作样本,计算样本统计量。prod求所有元素的乘积。
comsum和cumprod计算累加和累乘积。如
cumsum(1:5)
## [1] 1 3 6 10 15
cumprod(1:5)
## [1] 1 2 6 24 120
seq函数时冒号运算符的推广。比如,seq(5)等同于1:5,seq(11,15,by=2)产生11,13,15
rep函数用来产生重复数值。rep(c(1,3),2)把第一个自变量重复两次,结果相当于c(1,3,1,3)。
rep(c(1,3),c(2,4))相当于c(1,1,3,3,3,3)。
rep(c(1,3),each=2))结果相当于c(1,1,3,3)
逻辑型是R的基本数据类型之一,只有两个值TRUE和FALSE,缺失时为NA。
可用is.na()函数判断向量每个元素是否NA。
is.na(c(1,NA,3)>2)
## [1] FALSE TRUE FALSE
用is.finite()判断向量每个元素是否Inf值
比较运算符包括 < <= > >= == != %in%
注:%in%是比较特殊的比较, x %in% y的运算把向量y看成集合,运算结果是一个逻辑型向量。
c(1,3) %in% c(NA,3,4)
## [1] FALSE TRUE
函数match(x,y)起到和x %in% y 运算类似的作用,但是其返回结果不是找到与否,而是对x的每个元素,找到其在y中首次出现的下标,找不到时取缺失值,如
match(c(1,3),c(2,3,4,3))
## [1] NA 2
逻辑运算符为&,|和!,分别表示“同时成立”、“两者至少其一成立”、“条件的反面”
若cond是逻辑向量,用all(cond)测试cond的所有元素为真;用any(cond)测试cond至少一个元素为真
all(c(1, NA, 3) > 2)
## [1] FALSE
any(c(1, NA, 3) > 2)
## [1] TRUE
函数which()返回真值对应的所有下标。如
which(c(FALSE, TRUE, TRUE, FALSE, NA))
## [1] 2 3
which((11:15) > 12)
## [1] 3 4 5
函数identical(x,y)比较两个R对象x和y的内容是否完全相同,结果只会取标量TRUE与FALSE两种。如
identical(c(1,2,3), c(1,2,NA))
## [1] FALSE
函数duplicated()返回每个元素是否为重复值的结果,如
duplicated(c(1,2,1,3,NA,4,NA))
## [1] FALSE FALSE TRUE FALSE FALSE FALSE TRUE
用函数unique()可以返回去掉重复值的结果。
字符型向量是元素为字符串的向量
针对字符型数据最常用的R函数是paste()函数。paste()用来连接两个字符型向量,元素一一对应连接,默认用空格连接。
如paste(c(“ab”,“cd”),c(“ef”,“gh”))结果相当于c(“ab ef”,“cd gh”)
sep= 指定分隔符
用collapse= 参数可以把字符型向量的各个元素连接成一个单一的字符串。
如paste(c(“a”,“b”,“c”),collapse="")结果相当于“abc”
toupper()把字符型向量内容转为大写
tolower()把字符型向量转为小写
用nchar(x,type=‘bytes’)计算字符型向量x中每个字符串的以字节为单位的长度。
用nchar(x,type=‘chars’)计算字符型向量x中每个字符串的以字符个数为单位的长度。
substr(x,start,stop)从字符串x中取出从第start个到第stop个的子串,如
substr('JAN07', 1, 3)
## [1] "JAN"
substr(c('JAN07', 'MAR66'), 1, 3)
## [1] "JAN" "MAR"
用substring(x,start)可以从字符串x中取出从第start个到末尾的子串,如
substring(c('JAN07', 'MAR66'), 4)
## [1] "07" "66"
用as.numeric()把内容是数字的字符型值转换为数值。as.numeric()是向量化的,可以转换一个向量的每个元素为数值型。
用as.character()函数把数值型转换为字符型
为了用指定的格式数值型转换为字符型,可以使用sprintf()函数,其用法与C语言的sprintf()函数相似,只不过是向量化的。
sprintf('file%03d.txt', c(1, 99, 100))
## [1] "file001.txt" "file099.txt" "file100.txt"
用strsplit()函数可以把一个字符串按照某种分隔符拆分开,例如
x <- '10,8,7'
strsplit(x, ',', fixed=TRUE)[[1]]
## [1] "10" "8" "7"
sum(as.numeric(strsplit(x, ',', fixed=TRUE)[[1]]))
## [1] 25
用gsub()可以替换字符串中的子串,这样的功能经常用在数据清理中。比如,把数据中的中文标点改为英文标点,去掉空格等等。
x <- '1, 3; 5'
gsub(';', ',', x, fixed=TRUE)
## [1] "1, 3, 5"
对向量x,在后面加方括号和下标可以访问向量的元素和子集
负下标表示扣除相应的元素后的子集,如
x <- c(1,4,6.25)
x[-2]
## [1] 1.00 6.25
x[] 表示取x的全部元素作为子集。
x <- c(1,4,6.25)
x[] <- 999
x
## [1] 999 999 999
x[0]是一种少见的做法,结果返回类型相同、长度为零的向量,如numeric(0)。相当于空集。
函数which()可以用来找到满足条件的下标,如
x <- c(3, 4, 3, 5, 7, 5, 9)
which(x > 5)
## [1] 5 7
which.min()、which.max()求最小值的下标和最大值的下标,不唯一时只取第一个
ages <- c(30, 25, 28)
names(ages) <- c("李明", "张聪", "刘颖")
或者
ages <- setNames(c(30, 25, 28), c("李明", "张聪", "刘颖"))
用unname(x)返回去掉了元素名的x的副本
用names(x) <- NULL 可以去掉x的元素名
可以把向量x看成一个集合,但是其中的元素允许有重复。用unique(x)可以获得x的所有不同值。
unique(c(1, 5, 2, 5))
## [1] 1 5 2
用 a %in% x 判断a的每个元素是否属于向量x
函数match(x,table)对向量x的每个元素,从向量table中查找其首次出现位置并返回这些位置。没有匹配到的元素位置返回NA_integer_
intersect(x,y)求交集,结果中不含重复元素
union(x,y)求并集,结果中不含重复元素
setdiff(x,y)求差集,即x的元素中不属于y的元素组成的集合,结果中不含重复元素
setequal(x,y)判断两个集合是否相等
可以用typeof()函数来返回一个变量或表达式的类型:
typeof(1:3)
## [1] "integer"
typeof(c(1,2,3))
## [1] "double"
typeof(factor(c('F', 'M', 'M', 'F')))
## [1] "integer"
注意因子的结果是integer而不是因子
R还有两个函数mode()和storage.mode()起到与typeof()类似的作用
R中数据的最基本的类型包括logical,integer,double,character,complex,raw
为了判断某个向量x保存的基本类型,可以用is.xxx()类函数
在R语言中数值一般看作double,如果需要明确表明某些数值是整数,可以再数值后面附加字母L
is.integer(c(1, -3))
## [1] FALSE
is.integer(c(1L, -3L))
## [1] TRUE
四则运算中数值会被统一转换为double类型,逻辑运算中运算元素会被统一转换为logical类型。
在用c()函数合并若干元素时,如果元素基本类型不同,将统一转换成最复杂的一个,复杂程度从简单到复杂依次为:logical < integer < double < character
用print()函数可以显示对象内容。如果内容很多,显示行数可能也很多。用str()函数可以显示对象的类型和主要结构及典型内容
用factor()函数把字符型向量转换成因子
x <- c("男", "女", "男", "男", "女")
sex <- factor(x)
sex
## [1] 男 女 男 男 女
## Levels: 男 女
attributes(sex)
## $levels
## [1] "男" "女"
##
## $class
## [1] "factor"
levels(sex)
## [1] "男" "女"
用table()函数统计因子各水平的出现次数(称为频数或频率)。也可以对一般的向量统计每个不同元素的出现个数。
table(sex)
## sex
## 男 女
## 3 2
R中列表(list)类型来保存不同类型的数据。一个主要目的是提供R分析结果输出包装:输出一个变量,这个变量包括回归系数、预测值、残差、检验结果等等一系列不能放到规则形状数据结构中的内容。实际上,数据框也是列表的一种,但是数据框要求各列等长,而列表不要求。列表可以有多个元素,但是与向量不同的是,列表的不同元素的类型可以不同,比如,一个元素是字符串,一个元素是标量,一个元素是另一个列表。
定义列表函数list(),如
rec <- list(name="李明", age=30,
scores=c(85, 76, 90))
rec
## $name
## [1] "李明"
##
## $age
## [1] 30
##
## $scores
## [1] 85 76 90
用typeof()函数判断一个列表,返回结果是list。可以用is.list()函数判断某个对象是否列表类型。
单个列表元素必须用两重方括号格式访问。
列表的单个元素也可以用$格式访问
如果使用单重方括号对列表取子集,结果还是列表而不是列表元素
列表一般都应该有元素名,元素名可以看成是变量名,列表中的每个元素看成一个变量。用names()函数查看和修改元素名。
names(rec)
## [1] "name" "age" "scores"
names(rec)[names(rec)=="scores"] <- "三科分数"
names(rec)
## [1] "name" "age" "三科分数"
rec[["三科分数"]]
## [1] 85 76 90
可以修改列表元素内容
rec[["三科分数"]][2] <- 0
print(rec)
## $name
## [1] "李明"
##
## $age
## [1] 30
##
## $三科分数
## [1] 85 0 90
用as.list()把一个其它类型的对象转换成列表;用unlist()函数把列表转换成基本向量。
li1 <- as.list(1:3)
li1
## [[1]]
## [1] 1
##
## [[2]]
## [1] 2
##
## [[3]]
## [1] 3
li2 <- list(x=1, y=c(2,3))
unlist(li2)
## x y1 y2
## 1 2 3
strsplit()输入一个字符型向量并指定一个分隔符,返回一个项数与字符型向量元素个数相同的列表,列表每项对应于字符型向量中一个元素的拆分结果
x <- c("10, 8, 7", "5, 2, 2", "3, 7, 8", "8, 8, 9")
res <- strsplit(x, ","); res
## [[1]]
## [1] "10" " 8" " 7"
##
## [[2]]
## [1] "5" " 2" " 2"
##
## [[3]]
## [1] "3" " 7" " 8"
##
## [[4]]
## [1] "8" " 8" " 9"
矩阵用matrix函数定义,实际存储成一个向量,根据保存的行数和列数对应到矩阵的元素,存储次序为按列存储。
用nrow()和ncol()函数可以访问矩阵的行数和列数。
colnames()函数可以给矩阵每列命名
rownames()函数可以给矩阵每行命名
若x是向量,cbind(x)把x变成列向量,rbind(x)把x变成行向量
cbind(c(1,2), c(3,4), c(5,6))
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
apply(A,2,FUN)把矩阵A的每一列分别输入到函数FUN中,得到对应于每一列的结果,如
D <- matrix(c(6,2,3,5,4,1), nrow=3, ncol=2); D
## [,1] [,2]
## [1,] 6 5
## [2,] 2 4
## [3,] 3 1
apply(D, 2, sum)
## [1] 11 10
函数data.frame()可以生成数据框,如
d <- data.frame(
name=c("李明", "张聪", "王建"),
age=c(30, 35, 28),
height=c(180, 162, 175),
stringsAsFactors=FALSE)
print(d)
## name age height
## 1 李明 30 180
## 2 张聪 35 162
## 3 王建 28 175
data.frame()函数会将字符型列转换成因子,加选项stringsAsFactors=FALSE可以避免这样的转换。
nrow(d)求d的行数,ncol(d)或length(d)求d的列数。数据框每列叫做一个变量,每列都有名字,称为列名或变量名,可以用names()函数和colnames()函数访问。
数据狂可以用矩阵格式访问