数据转换(数据结构的转换:包括添加、删除、排序等等)
(1)关于数据框的转换
矩阵转换为数据框:
dstate.x77 <- as.data.frame(state.x77)输出FALSE#此时说明该数据不是数据框
is.data.frame(dstate.x77)返回TRUE#强制转换为数据框
数据框转换为矩阵:
as.matrix(data.frame(state.region,state.x77))
数据框中的数据类型不相同,转换为矩阵后,所有元素都变成字符串类型。
注意:不是所有数据结构都能进行转换,比如有些数据框就不能转换为向量或者因子。
(2)关于向量的转换
向量转换为矩阵:
x <- state.abb
dim(x) <- c(5,10)#此时x变成一个5行10列的矩阵
向量转换为因子:
as.factor(x)
向量转换为列表:
as.list(x)
向量转换为数据框:
data.frame(x,state.region,state.x77)
关于更多is和as的函数,可以使用methods(is)和methods(as)查看。
取子集:当数据集太多时想取固定行固定列来进行分析
(1)索引方式
who1 <- who[c(1,3,5,8),c(1:5)]#取1、3、5、8行,1到5列
who2 <- who[which(who$Continent==7),]#取Continent列=7的行
who3 <- who[which(who$CountryID>50 & who$CountryID<=100),]#取CountryID大于50且小于100的行
(2)subset函数
who4 <- subset(who,who$CountryID>50 & who$CountryID<=100)
(3)sample函数#进行有无放回的随机抽样
x <- 1:100
sample(x,60,replace=T) #从向量x中,有放回的随机抽取60个元素
who[sample(who$CountryID,30,replace=F),] #从数据框的CountryID中,无放回的随机抽取30个
(4)删除固定行/列
mtcars[-1:-5 ,] #删除第1到5行
mtcars[, -1:-5] #删除第1到5列
mtcars$mpg <- NULL #清空mtcars中的mpg这一列
数据框的添加与合并(增加行或列)
(1)
data.frame(USArrests,state.division)
(2)cbind列合并
cbind(USArrests,state.division)
(3)rbind行合并
注:要求新的数据与原来的数据有相同的列名,否则rbind无法运行。
data1 <- head(USArrests,30)
data2 <- tail(USArrests,30)
data3 <- rbind(data1,data2)《
若data1与data2之间有重复行,不会去除重复项,data2中的重复行的行名后会加字符1。要想取非重复行,可以:
data3[!duplicated(data3), ]
或者
unique(data3)
数据框的翻转
行列翻转:mtcars1 <- t(mtcars)
序列前后翻转:women[rev(rownames(women)),]
修改数据框中的值
data.frame(height=women$height*2.54,weight=women$weight)
这样操作不高效,可以使用transform函数:
transform(women,height=height*2.54) #将原height列乘以2.54
或
transform(women,cm=height*2.54) #增加一个cm列
数据框的排序
在R中,和排序相关的函数主要有三个:sort、order和rank函数。
(1)sort函数
sort函数是对向量进行排序,返回值是排序后的结果向量。
sort(state.name)#默认从小到大的顺序
rev(sort(rivers)) #降序
(2)order函数
order函数也是对向量进行排序,但其返回值是排序后元素的位置,也就是索引。
order(rivers)
mtcars[order(mtcars$mpg),] #此时返回具体数据的值而非索引,此时为升序
mtcars[order(-mtcars$mpg),] #降序
mtcars[order(mtcars$mpg,mtcars$disp),] #多条件排序,在符合mtcars$mpg排序的情况下,对mtcars$disp进行排序
(3)rank函数
rank函数是求秩的函数,其返回值是向量对应元素的排名。
对数据框进行数学计算
(1)
worldphones <- as.data.frame(WorldPhones)
rs <- rowSums(worldphones) #计算行和
total <- cbind(worldphones,Total=rs) #将总和添加到最后一列
cm <- colMeans(total) #计算每列平均数
rbind(total,Mean=cm)
(2)
apply(x,MARGIN,FUN)
x是数组、矩阵或数据框;MARGIN等于1代表对行进行处理,等于2代表对列进行处理;FUN代表要应用的函数。
如:
apply(WorldPhones,MARGIN=1,FUN = sum) #对每一行求和
apply(WorldPhones,MARGIN=2,FUN = mean) #对每一列求平均
apply(WorldPhones,MARGIN=2,FUN = Var)
apply(WorldPhones,MARGIN=2,FUN = log)
(3)其他apply系列函数
lapply(x,FUN):l代表list,x是列表,返回值是列表。
sapply(x,FUN):s代表simplify,x是列表,返回值是向量或者矩阵。
tapply(x,INDEX,FUN):x是向量或其他,INDEX是一组因子,利用这个因子,可以对第一个参数的数据进行分组。
数据的中心化与标准化
数据中心化:是指数据集中的各项数据减去数据集的均值。
数据标准化:是指在中心化之后再除以数据集的标准差,即数据集中的各项数据减去数据集的均值再除以数据集的标准差。
简单来看:
x <- c(1,2,3,6,3)
中心化:x-mean(x)
标准化:(x-mean(x))/sd(x)
R中实现数据中心化和标准化可以使用scale函数:
scale(x,center,scale):center为TRUE就是做中心化处理,scale为TRUE(scale=T)就是做标准化处理。