数据结构
向量 vector- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*其他编程语言中没有向量,R的精髓!
类似于数学中集合的概念,由一个或多个元素所构成
用于存储数值型,字符型或逻辑型数据的一维数组
向量中元素只能为一个数据类型,不能混合
创建
c() #可以理解为concatenate/collect/combine
e.g
(1) x<- c(1,2,3,4,5)
(2) c(1:100) #构建等差数列1
seq(from= 1, to = 100, by = 2) #构建等差数列2,等差为2
seq(from= 1, to = 100, length.out =10) #只输出10个值,因此等差变大
(3) x[x>3] 取出x>3的值
(4) rep(x,each = 2, time=5) #重复打印x每个元素两遍,五次
rep(x,c(2,3,5,1,3)) #指定x中每个元素的重复次数
索引
***R语言中索引从1开始而非0***
x[1] #x的第一个元素
x[c(4:18)] #x4~18个元素
x[c(11,11,5,90,2)] #指定位置的元素
%in% 元素是否在向量内,无需循环
e.g k<- z%in%c("one", "two")
names() #命名向量
e.g names(y) <- c("one", "two","three")
修改
x[1] <- 1 #修改索引为1的x
append( x = 向量名, values = 赋值, after= xxx) #在xxx后面插入某元素
rm(x) #删除向量
y <- y[-c(1:3)] #删除元素
运算
x+1 #x中每一个元素+1
x+y #对应索引的元素相加,两个向量之间必须有倍数关系
* #相乘
** #求幂
%% #求余
%/% #整除
常用函数
abs(x) #求绝对值
sqrt(x) #求平方根
log(16,base = 2) #以2为底
log10(x) #求以10为底的对数
exp(x) #计算指数
ceiling(x) #返回不小于x的最大整数
floor(x) #返回不大于x的最大整数
trunc(x) # 返回整数部分
round(x, num)#保留xnum位数=
sin(x)
cos(x)
sum(x) #求总和
max(x) min(x) #求最值
range(x) #求x范围
mean(x) #求x平均值
var(x) #返回x发方差
sd(x) #返回x标准差
prod(x) #求x连乘的积
median(x) #求x中位数
quantile(x) #计算分位数
which.max(x) #返回x元素最大值索引值
cut(num,c(seq(0,100,10))) #进行频数的统计
矩阵 Matrix- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*矩阵是二维的,需要有行和列
*矩阵中数据类型需要一致
m<- matrix(1:20, 4, 5, byrow = T) #构建一个四行五列的矩阵,按行来排列矩阵
#为行和列命名
rnames <- c("R1", "R2", "R3", "R4", "R5") #为行命名
cnames <- c("C1", "C2", "C3", "C4", "C5") #为列命名
dimnames(m) <- list(rnames, cnames)
dim(x) <- c(4,5) #给向量添加维数构建矩阵
索引
m[1,c(2,3,4)] #m矩阵第一行,二三四列的元素
m[ ,2] #访问第二列
m[-1,2] #去除第一行,访问第二列
m["R1","C2"] #也可以通过名称访问
运算
单矩阵:
每个元素进行相同操作
双矩阵:
四则运算 :行列一致
n*t #矩阵内积
n %*%t #矩阵外积
diag(m) #求对角线
t(m) #矩阵转置,进行行和列的互换
# 计算和
colSums(m)
rowSums(m)
# 计算平均值
colMeans(m)
rowMeans(m)
数组Array- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
* 其实就是多维的矩阵
创建
dim1 <- c("A1","A2" )
dim2 <- c("B1","B2","B3" )
dim3 <- c("C1", "C2", "C3", "C4" )
z <- array(1:24, c(2,3,4),dimnames = list(dim1, dim2, dim3))
列表 list- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*在其他编程语言中R一般和数组等同,但是在R语言中,列表是R最复杂的一种数据结构
*列表就是一些对象的有序组合,列表种可以存储若干向量,矩阵,数据框,甚至其他列表的组合
和向量对比:
1.模式上和向量类似,都是一维数据集合
2.向量只能存储一种数据类型,列表中的对象可以是R中任何数据结构,甚至是列表本身
创建
# 这里创建一个列表玩玩
a <- 1:20
b <- matrix(1:20, 4)
c <- mtcars
d <- "this is a test list"
mlist <- list(name1 = a,name2 = b,name3 = c,name4 = d) #注意名称可要可不要
访问
mlist[1] #索引类似于向量,输出列表的一个子集,还是列表
mlist[[1]] #两个中括号则输出元素本身的数据类型
mlist[c(1,4)] #访问多个元素的时候记得放入向量里
mlist $ name1 #通过$+名字访问,十分高效
修改
访问后直接赋值
删除
1. mlist <- mlist[-5] #负索引,赋值给原来的列表
2. mlist[[5]] <- NULL #把对应值赋值为NULL
数据框 Dataframe- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
*是一种表格式的数据结构,旨在模拟数据集
*数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量,不同行业对数据集的行和列叫法不同
*实际上是一个列表。列表中的元素是向量,这些向量构成数据库的列,每一列必须有相同的长度,所以数据框是矩形结构,而且数据框的列必须命名
矩阵与数据库
1. 数据框形状上很想矩阵
2. 数据库是比较规则的列表
3. 矩阵必须为同一数据类型
4. 数据框每一列必须是同一类型,每一行可以不同
创建
state <- data.frame(state.name, state.abb, state.reigon, state.x77) #将每个数据存储为向量后用data.frame 合并
访问
state[c(2,4)] #输出第二和第四列
state[,"state.abb"]
state["Alabama",] #通过名字索引
state$Murder # $符索引
e.g
lm(weight ~height ,data = women) #线性回归使用案例
#attach加载数据框到搜索路径中
e.g
attach(mtcars) #这样可以直接敲列名而不用$了
detach(mtcars) #使用完数据后取消加载
因子Factor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
作用:分类,计算频数和频率
变量分类:
名义型:如城市名,省份
有序型:good, better, best, mtcars$cyl(汽车的气缸数), state.division, state.region
连续型:某个范围中任意值如身高,年龄,增长率
在R中名义型变量和有序性变量称为因子,factor。这些分类变量的可能值成为一个水平(level),如good, better, best都是一个level,这些水平值构成的向量就称为因子
定义
f <- factor(c("red","red", "blue", "green", "blue", "blue"))
week <- factor (c("Mon", "Fri", "Thu","Wed", "Mon", "Fri","Sun", ordered = T, levels = c("Mon","Tue", "Wed", "Thu", "Fri", "Sat", "Sun")) #给出因子的水平, 这样输出就有顺序
fcyl <- factor(mtcars$cyl) #定义一个变量为因子