R语言基础 - 操纵数据:重要函数的使用

A. 处理循环

  - R不仅有for/while循环语句,还有更强大的实现循环的"一句话"函数

B. 排序

C. 总结数据信息

1. lapply:可以循环处理列表中的每一个元素,总是返回一个列表

  - lapply(列表,函数/函数名,其他参数)

  - sapply:简化结果

    a. 结果列表元素长度均为1,返回向量

    b. 结果列表元素长度相同且大于1,返回矩阵

# lapply

str(lapply)

x <- list(a=1:10, b=c(11,21,31,41,51))
lapply(x, mean)  # 计算每个列表的平均值

x <- 1:4
lapply(x, runif)  # 从一个均匀分布的0到1里抽取若干个数出来
lapply(x, runif, min=0, max=100)  # 从一个均匀分布的0到100里抽取若干个数出来

x <- list(a=matrix(1:6,2,3), b=matrix(4:7,2,2))
lapply(x, function(m) m[1,])  # 取出每个矩阵的第一行

# sapply
x <- list(a=1:10, b=c(11,21,31,41,51))
lapply(x, mean)
sapply(x, mean)  # 返回结果从列表简化为向量  

2. apply:沿着数组的某一维度处理数据

  - 例如,将函数用于矩阵的行或列

  - 虽然与for/while循环的效率相似,但是只用一句话就可以完成

  - apply(数组,维度,函数/函数名)

# apply

x <- matrix(1:16, 4, 4)

apply(x, 2, mean)  # 1维度为行,2维度为列
apply(x, 2, sum)

apply(x, 1, sum)
apply(x, 1, mean)

rowSums(x) # 行和
rowMeans(x) # 行平均
colSums(x) # 列和
colMeans(x) # 列平均

x <- matrix(rnorm(100), 10, 10) 
# 从正态分布里随机抽取100个数据,组成一个10*10的矩阵
apply(x, 1, quantile, probs=c(0.25, 0.75)) 
# quantile求数据的百分位点
# probs表示求25%和75%对应百分位点的数据

x <- array(rnorm(2*3*4), c(2,3,4))
# 第一维度是2,第二维度是3,第三维度是4
apply(x,c(1,2),mean) # 在第一维和第二维组成的平面上,沿着第三维求平均
apply(x,c(1,3),mean) # 在第一维和第三维组成的平面上,沿着第二维求平均
apply(x,c(2,3),mean) # 在第二维和第三维组成的平面上,沿着第一维求平均

3. mapply:lapply的多元版本

  - mapply(函数/函数名,数据,函数相关的参数)

# mapply

list(rep(1,4),rep(2,3),rep(3,2),rep(4,1))

mapply(rep, 1:4, 4:1) # 函数名,数据,重复次数

s <- function(n, mean, std){
  rnorm(n, mean, std)
} 
# 从正态分布中要抽取的个数,随机分布的总体的均值,随机分布对应的标准差

s(4,0,1) # 抽取n个数据,均值为mean,标准差为std

mapply(s, 1:5, 5:1, 2)
list(s(1,5,2),s(2,4,2),s(3,3,2),s(4,2,2),s(5,1,2))

4. tapply:对向量的子集进行操作

  - tapply(向量,因子/因子列表,函数/函数名)

# tapply

x <- c(rnorm(5), runif(5), rnorm(5,1))
# 正态分布的5个值,均匀分布的5个值,mean为1且std为0的正态分布的5个值
f <- gl(3, 5) # 3个水平,每水平下5个元素

tapply(x, f, mean) # 对x向量,按照因子的水平进行分组,对每一组求均值
tapply(x, f, mean, simplify=FALSE)

5. split:根据因子或因子列表将向量或其他对象分组,通常与lapply一起使用

  - split(向量/列表/数据框,因子/因子列表)

# split

x <- c(rnorm(5), runif(5), rnorm(5,1))
f <- gl(3, 5)
split(x, f) # 对x向量,按照因子的水平进行分组

lapply(split(x, f), mean)

head(airquality)
s <- split(airquality, airquality$Month)

table(airquality$Month)

lapply(s, function(x) colMeans(x[,c("Ozone","Wind","Temp")],na.rm=TRUE))
sapply(s, function(x) colMeans(x[,c("Ozone","Wind","Temp")]))
sapply(s, function(x) colMeans(x[,c("Ozone","Wind","Temp")],na.rm=TRUE))

6. 排序

  - sort:对向量进行排序;返回排好序的内容

  - order:返回排好序的内容的下标 / 多个排序标准

# sort and order

x <- data.frame(v1=1:5, v2=c(10,7,9,6,8), v3=11:15, v4=c(1,1,2,2,1))

sort(x$v2)
sort(x$v2, decreasing=TRUE)

order(x$v2)
x[order(x$v2),]

x[order(x$v4,x$v2),]
x[order(x$v4,x$v2,decreasing=TRUE),]

7. 总结数据信息

# summarize data

head(airquality)
tail(airquality, 2)

summary(airquality)
str(airquality)

table(airquality$Month)
table(airquality$Ozone)
table(airquality$Ozone, useNA="ifany")
table(airquality$Month, airquality$Day)

any(is.na(airquality$Ozone))
sum(is.na(airquality$Ozone))

all(airquality$Month<12)

titanic <- as.data.frame(Titanic)
head(titanic)
dim(titanic)
summary(titanic)

x <- xtabs(Freq ~ Class + Age, data=titanic)
ftable(x)

object.size(airquality)
print(object.size(airquality), units='Kb')

8. 小结

  

 

posted on 2017-02-20 16:16  你的踏板车要滑向哪里  阅读(663)  评论(0编辑  收藏  举报

导航