开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
数据转换(四)
如何对数据框进行数学计算?
有很多种方法,以wordphones数据为例:
rs <- rowSums(WorldPhones)
cm <- colMeans(WorldPhones)
rowsums()和colmeans()函数可以计算行和还有列的平均数
使用cbind()函数可以直接在数据后面添加计算后的一列数据
total <- cbind(WorldPhones,total=rs)
使用rbind()函数可以直接在数据后面添加计算后的一行数据
total2 <- rbind(WorldPhones,meanvalue=cm)
#在R中提供了apply系列函数
#首先是apply()函数的用法,对数据框的每一行进行求和
apply(WorldPhones,MARGIN = 1,FUN =sum)
#其中,wordphones代表要进行求和的数据集
margin是数据的维数,margin=1代表按行,margin=2代表按列,FUN参数代表使用的函数
对数据框的每一列进行求平均值
apply(WorldPhones,MARGIN = 2,FUN =mean)
对数据框的每一列进行求log值(对数值)
apply(WorldPhones,MARGIN = 2,FUN =log)
lapply()函数用法与apply()函数类似,不过返回值是列表,同理,sapply()也是返回值不同,sapply()函数返回的是向量或者矩阵。
以state.center数据为例,该数据是列表数据:
统计一下列表中元素的个数:
lapply(state.center,FUN = length)
因为列表中不存在行和列,所以不需要有margin参数,返回的结果值是一个列表
tapply()函数用于处理因子数据,根据因子来分组,然后根据分组来处理
以state.name和state.division为例,state.division作为因子数据进行分组:
计算每个类型区中州的数量
tapply(state.name,state.division,FUN = length)
接下来是数据的中心化与标准化处理(为了消除数据量纲对数据的影响),以state.x77数据为例:
数据的中心化,是指数据集中的各项数据减去数据集的均值
数据的标准化,是指在中心化之后再除以数据集的标准差,即数据集汇总的各项数据减去数据集的均值再除以数据集的标准差
在R中可以直接使用scale()函数进行中心化和标准化的处理,当scale()函数中的两个参数都为True时,就是做中心化(center=T)和标准化处理(scale=T)
scale(state.x77,center = T,scale = T)
经过中心化和标准化处理过后的数据,在绘制heatmap时会比较精确,对比性比较强。
数据转换(五)——reshape2包的使用(详细可参考R语言实战)
假设有x,y两个数据框数据如下:
x <- data.frame(k1=c(NA,NA,3,4,5),k2=c(1,NA,NA,4,5),data=1:5)
y <- data.frame(k1=c(NA,2,NA,4,5),k2=c(NA,NA,3,4,5),data=1:5)
merge()函数
使用merge()函数可以根据一个或多个共有的变量来进行合并,合并两组数据中共有变量列中相同的行
#以k1作为共有变量合并:
merge(x,y,by = "k1")
#以k2作为共有变量合并,并排除有NA的情况:
merge(x,y,by = "k2",incomparables = NA)
reshape2包
reshape2包是一个重构和整合数据的万能工具,可以把数据转化成任何想要的形式
使用airquality数据为例:
首先,为了输入方便,使用toloower()函数将列名改写成小写
names(airquality) <- tolower(names(airquality))
然后可以使用melt()函数融合数据,融合之后,每一行都是唯一的标识符~变量的组合:
aql <- melt(airquality)
也即是将宽数据变成长数据的过程
Id参数是用于告诉melt()函数哪一行或者那一列用作观测,而剩余的数据作为观测值
aql <- melt(airquality,id.vars = c('month','day'))
数据的重构使用dcast()或者acast()函数,处理数据框使用dcast()函数,acast()函数处理向量、矩阵或者数组:
Formula参数用于描述数据的形状, “~”在R中代表两者相关联,用以下代码即可重构数据( zhuanlan.zhihu.com/p/40439051 )
aqw <- dcast(aql,month+day ~variable)
也可以只重构月数据,并对日数据求平均值,求一个月的平均值,还可以使用na.rm()去除缺失值:
aqw <- dcast(aql,formula = month ~variable,fun.aggregate = mean,na.rm=TRUE)