- apply()
-
4 4.0
> #apply系列函数
>
> #apply(X, MARGIN, FUN, ...)
> #参数列表:
> #X:数组、矩阵、数据框
> #MARGIN: 按行计算或按按列计算,1表示按行,2表示按列
> #FUN: 自定义的调用函数
> #…: 更多参数,可选
>
> apply(iris[,1:4],2,sum)
Sepal.Length Sepal.Width Petal.Length Petal.Width
876.5 458.6 563.7 179.9
>
> #补充函数
> #按行求和求平均、按列求和求平均
> #rowSums(x,na.rm=FALSE)\rowMeans(x,na.rm=FALSE)
> #colSums(x,na.rm=FALSE)\colMeans(x,na.rm=FALSE)
> colSums(iris[,1:4])
Sepal.Length Sepal.Width Petal.Length Petal.Width
876.5 458.6 563.7 179.9
>
> #引用http://blog.fens.me/r-apply/中提到例子,理解函数使用方法
>
> #生成data.frame
> x<-cbind(x1=3,x2=c(4:1,2:5));x
x1 x2
[1,] 3 4
[2,] 3 3
[3,] 3 2
[4,] 3 1
[5,] 3 2
[6,] 3 3
[7,] 3 4
[8,] 3 5
> # 自定义函数myFUN,第一个参数x为数据,数据框的x1列加1,并计算出x1,x2列的均值
> # 第二、三个参数为自定义参数,可以通过apply的'...'进行传入。
> #生成data.frame
> x<-cbind(x1=3,x2=c(4:1,2:5));x
x1 x2
[1,] 3 4
[2,] 3 3
[3,] 3 2
[4,] 3 1
[5,] 3 2
[6,] 3 3
[7,] 3 4
[8,] 3 5
> apply(x,1,function(x,c1,c2) {c(sum(x[c1],1),mean(x[c2]))} , c1='x1',c2=c('x1','x2'))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 4.0 4 4.0 4 4.0 4 4.0 4
[2,] 3.5 3 2.5 2 2.5 3 3.5 4
> #定义for循环实现
> df<-data.frame()
> for (i in 1:nrow(x)) {
+ row<-x[i,]
+ df<-rbind(df,rbind(c(sum(row[1],1),mean(row))))
+ }
> df
V1 V2
1 4 3.5
2 4 3.0
3 4 2.5
4 4 2.0
5 4 2.5
6 4 3.0
7 4 3.5
8 4 4.0
> #利用向量运算实现
> data.frame(x1=x[,1]+1,x2=rowMeans(x))
x1 x2
1 4 3.5
2 4 3.0
3 4 2.5
4 4 2.0
5 4 2.5
6 4 3.0
7 4 3.5
8 4 4.0
- lapply()
#lapply(X, FUN, ...)
> #参数列表:
> #X:list、data.frame数据
> #FUN: 自定义的调用函数
> #…: 更多参数,可选
>
> #lapply就可以很方便地把list数据集进行循环操作了
> #还可以用data.frame数据集按列进行循环,
> #但如果传入的数据集是一个向量或矩阵对象,那么直接使用lapply就不能达到想要的效果了。
>
> lapply(iris[,1:4],mean)
$Sepal.Length
[1] 5.843333
$Sepal.Width
[1] 3.057333
$Petal.Length
[1] 3.758
$Petal.Width
[1] 1.199333
> #将列表转换为数据框
> data.frame(do.call(cbind,lapply(iris[,1:4],mean)))
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.843333 3.057333 3.758 1.199333
> # data.table::rbindlist()
> library(data.table)
> rbindlist(数据表或数据框列表)
#sapply(X, FUN, ..., simplify=TRUE, USE.NAMES = TRUE) 同种数据类型
#参数列表:
#X:数组、矩阵、数据框
#FUN: 自定义的调用函数
#…: 更多参数,可选
#simplify: 是否数组化,当值array时,输出结果按数组进行分组
#USE.NAMES: 如果X为字符串,TRUE设置字符串为数据名,FALSE不设置
sapply(iris[,1:4],mean)
#将向量转化为数据框
data.frame(t(sapply(iris[,1:4],mean)))
sapply(iris,class)
sapply(iris[,1:4],function(x) {x>3})
#mapply也是sapply的变形函数,类似多变量的sapply,但是参数定义有些变化。第一参数为自定义的FUN函数,第二个参数’…’可以接收多个数据,作为FUN函数的参数调用。
#mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,USE.NAMES = TRUE)
#参数列表:
#FUN: 自定义的调用函数
#…: 接收多个数据
#MoreArgs: 参数列表
#SIMPLIFY: 是否数组化,当值array时,输出结果按数组进行分组
#USE.NAMES: 如果X为字符串,TRUE设置字符串为数据名,FALSE不设置
#rnorm(1,0,1),rnorm(2,10,1),rnorm(3,100,1)用
mapply(rnorm,
c(1,2,3),# n
c(0,10,100),#mean
c(1,1,1)) #sd
mapply(mean,iris[,1:4])#所有行罗列为参数,每行的第一个元素为一组
#tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)
#参数列表:
#X: 向量
#INDEX: 用于分组的索引
#FUN: 自定义的调用函数
#…: 接收多个数据
#simplify : 是否数组化,当值array时,输出结果按数组进行分组
tapply(1:10,rep(1,10),sum)
tapply(1:10,1:10 %% 2 , sum)
tapply(1:10,1:10 %% 2 == 1,sum)
tapply(iris$Sepal.Length,iris$Species,mean)
m<-matrix(1:8,ncol=2,dimnames=list(c('chun','xia','qiu','dong'),c('male','female')))
m
tapply(m,list(c(1,1,2,2,1,1,2,2),
c(1,1,1,1,2,2,2,2)),sum)
> f.data <- data.frame(x=rnorm(10),y=runif(10))
> lapply(f.data,FUN=function(x) list(median=median(x),sd=sd(x)))
$x
$x$median
[1] 0.2178978
$x$sd
[1] 0.9282364
$y
$y$median
[1] 0.5088231
$y$sd
[1] 0.3062797
> sapply(f.data,FUN=function(x)list(median=median(x),sd=sd(x)))
x y
median 0.2178978 0.5088231
sd 0.9282364 0.3062797
>
> #五、replicate()
>
> #函数replicate(),它可以将某个函数重复运行N次,常常用来生成较复杂的随机数。下面的例子即先建立一个函数,模拟扔两个骰子的点数之和,然后重复运行10000次。
>
> game <- function() {
+ n <- sample(1:6,2,replace=T)
+ return(sum(n))
+ }
> replicate(n=10000,game())
[1] 7 8 9 5 5 5 8 11 2 10 3 9 7 11 11 7 9 8 7 5 6
[22] 10 7 9 4 6 7 6 10 6 10 4 3 3 4 8 6 7 10 6 9 8
[43] 7 7 8 5 6 5 8 8 7 3 5 7 12 6 5 7 7 9 7 6 7
[64] 9 4 3 6 9 8 7 2 3 4 5 6 3 9 8 4 9 10 4 12 5
[85] 9 8 9 7 6 7 7 8 7 12 9 5 6 5 8 8 6 11 3 7 5
[106] 7 7 4 10 6 5 9 7 7 10 11 9 9 9 10 6 3 5 5 12 7
[127] 10 11 6 5 9 8 8 7 6 5 4 3 10 9 7 4 12 3 7 8 5
[148] 5 6 4 6 3 9 9 9 3 6 9 10 8 12 6 6 4 9 7 8 3
[169] 6 7 10 7 4 12 7 8 9 12 7 5 5 4 7 7 5 9 5 10 9
[190] 8 11 7 9 4 6 6 10 6 4 3 7 6 5 3 4 4 5 8 10 11
[211] 7 7 4 8 5 6 3 2 4 12 5 7 8 2 6 7 7 8 9 8 6
[232] 8 6 6 7 5 3 7 4 8 6 7 7 9 6 8 9 5 5 3 11 5
[253] 4 4 5 3 6 7 11 5 10 6 5 6 7 3 8 6 5 9 6 5 6
[274] 10 6 7 8 8 7 8 4 7 4 6 10 8 7 10 4 6 7 10 7 7
[295] 5 7 4 7 11 5 6 6 9 7 9 5 12 3 5 11 8 7 7 9 3
[316] 10 9 8 4 9 8 8 3 8 8 10 3 11 2 7 4 10 6 7 7 9
[337] 3 6 11 5 10 10 8 10 9 10 7 7 11 8 5 9 8 5 10 8 2
[358] 9 3 4 8 9 7 4 10 5 11 5 8 8 12 8 5 11 5 9 7 5
[379] 6 3 9 4 5 7 4 10 12 7 5 4 5 9 11 5 6 8 5 9 4
[400] 9 5 4 7 8 6 4 7 6 10 7 8 6 12 8 9 10 8 10 7 5
[421] 7 11 4 7 8 2 8 8 7 6 9 11 8 11 7 10 7 4 5 7 10
[442] 6 9 7 5 4 3 6 7 8 8 3 4 10 4 9 6 7 7 7 9 7
[463] 4 3 5 6 10 7 6 7 11 10 9 8 8 4 7 6 9 5 7 11 6
[484] 11 7 10 5 3 6 5 6 8 4 8 5 4 5 10 8 4 7 4 9 8
[505] 5 2 12 6 4 11 9 10 10 3 7 3 10 3 3 6 10 7 6 10 2
[526] 12 8 10 9 5 8 9 7 7 7 8 4 6 6 8 6 8 6 11 7 8
[547] 3 5 3 10 3 8 6 3 10 10 12 9 10 6 11 9 5 7 4 7 3
[568] 10 5 9 6 2 7 6 6 4 9 9 7 9 11 6 3 4 7 5 6 6
[589] 5 8 7 7 2 6 2 11 7 5 6 6 9 11 12 7 10 10 9 6 11
[610] 5 12 9 8 8 4 4 9 4 10 10 8 4 12 11 5 8 8 7 5 10