R语言学习DAY02:数据操作

重点来了,今天学习R的向量化操作,这一操作使得在R中很多情况下可以不用写循环来实现对对象内的每个元素进行计算。

sapply函数

假如定义了一个只能接受数值参数的函数:

func <- function(x){
  if(x %% 2 == 0){
    ret <- "even"
  } else {
    ret <- "odd"
  }
  return(ret)
}

如果用向量作为参数,运行会报错。所以请出可用于向量化计算的函数sapply(obj, function)。只需一个语句,就可以对向量中的每个元素实现计算:

vec <- round(runif(5) * 100)
sapply(vec, func)

当然另一个方法是把我们定义的这个函数改装成可以接受向量的函数:

funcv <- Vectorize(func)

sapply不光能对向量进行处理,还可以对数据框进行处理。例如计算数据库前4个变量的变异系数:

sapply(iris[ , 1:4], function(x) sd(x)/mean(x) ) #iris是著名的鸢尾花数据集

如果要对行进行计算,例如计算每一行第一列和第二列之和,用rowSums就行了

rowSums(iris[ , 1:2])

lapply函数

lapply函数的功能和sapply类似,但是lapply返回的结果是一个列表。这种格式有时候不是很好直接利用,所以还需要转化。比如:

t(as.data.frame(lapply(iris[, 1:3], func))

apply函数

apply函数主要用于处理矩阵,方便的地方在于可以在函数中指定参数MARGIN =,若为1表示以行为计算单位,若为2表示以列为计算单位

vec <- round(runif(12)*100)
dim(vec) <- c(3,4)
apply(vec, MARGIN = 1, sum) #计算每行之和
apply(vec, MARGIN = 2,  function(x) max(x) - min(x) #计算每列极差

tapply函数

tapply函数的特点在于可以指定参数INDEX,用于对数据进行分组,例如:

tapply(X = iris$Sepal.Length, INDEX = list(iris$Species), FUN =mean)
# 按列求每种花sepal.length均值

aggregate函数

aggregate函数功能与tapply类似,但它的输出结果是数据框。

aggregate(iris$Sepal.Length, by = list(iris$Species), mean)

replicate函数

replicate函数的作用在于反复调用某个函数生成某个结果,常在统计模拟中使用。

replicate(100, mean(rnorm(10000))
 #生成10000个正态分布,计算其均值,再将这一步骤重复100次

以上是常用的向量化操作函数。下面介绍常用的数据转换方式

取子集和编码转换

取子集常用的函数是subset(obj, row, col),第一个参数指定要取子集的数据对象,第二个参数指定要取的行数,可以是逻辑判断式,可以是一个向量,第三个参数指定要取的列数
编码转换常用的函数是transform,具体用法:

a <- transform(iris, v1 = log(iris[,1]))
#对iris第一列取对数,命名为v1,存储到新数据框a中

以及对数据进行分组,常用到cut函数:

q50 <- quantile(a$v1, 0.5) #取中位数
groupvec <- c(min(a$v1), q50, max(a$v1)) # 确定分组点
labels <- c('A','B')
a$v2 <- cut(a$v1, breaks = groupvec, labels = labels, include.lowest = TRUE)

还有就是将字符或者数字因子化,默认的顺序按照从小到大

vec_fac <- factor(vec, labels = c("male","female","unknow"))
# 将vec因子化,按照顺序分别赋为因子male、female和unknow
levels(vec_fac) <- c("male", "female", "male")
# 用male代替原来unknow标签

长宽数据格式

本来还以为长宽格式和常见的编程语言里对数据类型的定义是一样的,仔细看了之后发现这是描述数据形式的术语。
宽型数据指的是变量由不同列形式构成,是常见的表示样品-观测的数据矩阵形式;而长型数据则是将每个变量拆开,有种单独观测的感觉,各变量名在一列,变量对应的取值位于另一列,可以将长型数据理解为“只包含一个数值变量,其他都是分类变量”的数据形式。
有时数据框是由宽型数据和长型数据混合构成的,例如iris数据集,前4列为宽型数据,而最后一列可以视为长型数据,表示各个分类。
reshape2包用于处理长型数据。
dcast函数用于对长型数据汇总计算,举个例子

library(reshape2)
dcast(iris, Species~. , value.var = 'Petal.Width', fun = mean)

该函数有三个参数,第一个参数表示要分析的对象,第二个参数是一个公式,表示数据的分组方式,此处按照Species变量分组,第三个参数表示要分析的变量,第四个参数表示计算用的函数(和aggregate是不是有点像)

利用melt(obj, id = ' ')函数可以将混合型数据转变为宽型数据,obj是要分析的对象,id表示不参与融合的变量(即已经是分类变量),如果有多个变量,则指定参数为id.var =,后跟一个字符向量
melt()进行预处理后,就可以用dcast()进行更详细的分类描述计算了,例如:

long_iris <- melt(iris, id = 'Species')
dcast(long_iris, Species~variable, value.var = 'value', fun = mean)
# 计算每一种花的4个维度的均值
# 注意其中Species是因变量,variable是自变量,因变量放在行的位置上,自变量放在列的位置上,是要汇总的结果
# 可以指定多个因变量,用“+”相连

数据的拆分和合并

若是取子集,可以直接用subset()函数,或者用方括号进行索引。若要对数据进行拆分,则可以用split函数,拆分后的数据集以列表的形式存储。
但是大部分情况下单纯得到拆分的数据集没有太大意义,我们需要的是对拆分后的数据集进行运算,所以只需得到计算的结果就行了。这时需要dplyr包中的ddply函数

ddply(data, variable, fun)

其中data指定要分析的数据集,variable指定要分类的变量,fun是拆分计算的函数,若要按照两个变量拆分,可以使用y~x的方式指定。
总结一下,已经学到了3个用于分类计算的函数:

aggregrate(obj, by = , fun) 
#只能对一个数值进行分析,且只能按照一个变量分类,返回数据框形式
dcast(data = ,formula, fun)
#只能对长型数据进行分析,实际上即只能对一个数值进行分析,可以按照多个变量分类
ddply(dataset, formula, fun)
#可以按照多个变量划分,且可以计算数据库中的所有变量

若要对数据进行合并,增加变量,可以使用merge(dataset1, dataset2, by =)函数,但R中还有sqldf包,可以直接对数据框用sql语句进行操作(这个太良心了)

你可能感兴趣的:(R语言学习DAY02:数据操作)