R 语言 apply 系列函数

  •  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() 
#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()
#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() 
#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)
  •  replicate()
> 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
 

猜你喜欢

转载自blog.csdn.net/baibingbingbing/article/details/81325302