R中apply等函数用法[转载]

转自:https://www.cnblogs.com/nanhao/p/6674063.html

1.apply函数——对矩阵

 功能是:Retruns a vector or array or list of values obtained by applying a function to margins of an array or matrix.

就是说apply把一个function作用到array或者matrix的margins(可以理解为数组的每一行或者每一列)中,返回值时vector、array、list。

apply函数经常用来计算矩阵中行或列的均值、和值的函数。

rname = c("one","two","three")
cname = c("first","second")
b <- matrix(1:6,nrow=3, dimnames = list(rname, cname))

b为:
         first second
one       1      4
two       2      5
three     3      6

 

 使用以上为数据举例。

apply(b,1,sum)

结果:
 one   two three 
    5     7     9 

 

 这里有几个元素它的输出结果就会有几列。

比如对这个sum,对于行进行求和,那么有3行就有3个结果元素。

上面的指令代表对矩阵b进行行计算,分别对每一行进行求和。函数涉及了三个参数:

第一个参数是指要参与计算的矩阵

第二个参数是指按行计算还是按列计算,1——表示按行计算,2——按列计算

第三个参数是指具体的运算函数。

第四个参数是fargs是f的可选参数集。

> z <- matrix(1:6, nrow = 3)
> f <- function(x) {
+         x/c(2, 8)
+ }
> apply(z,1,f)  #f得到3个元素,每个元素(组件)里有两个值,所以是3列,竖着来看
      [,1]  [,2] [,3]
[1,]  0.5 1.000 1.50
[2,]  0.5 0.625 0.75

 

 //这个例子还挺好的,最终的结果返回的是一个矩阵。那么apply输出是向量或者矩阵。

2.lapply函数——list

lapply()(代表list apply)与矩阵的apply()函数的用法类似, 对列表的每个组件执行给定的函数,并返回另一个列表

> x <- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
> lapply(x, mean)
$a
[1] 5.5

$beta
[1] 4.535125

$logic
[1] 0.5

 

//这里的exp是e的多少次方。

3.sapply()——simplified lapply

sapply()(代表simplified [l]apply)可以将结果整理以向量,矩阵,列表 的形式输出。

> sapply(x, mean)
       a     beta    logic 
5.500000 4.535125 0.500000 
> sapply(x, quantile)   #每一个对应组件输出5个元素,所以为5行,像矩阵一样,竖着来的。
         a        beta logic
0%    1.00  0.04978707   0.0
25%   3.25  0.25160736   0.0
50%   5.50  1.00000000   0.5
75%   7.75  5.05366896   1.0
100% 10.00 20.08553692   1.0
> sapply(2:4, seq)
[[1]]
[1] 1 2

[[2]]
[1] 1 2 3

[[3]]
[1] 1 2 3 4
> sapply(x, mean)
       a     beta    logic 
5.500000 4.535125 0.500000 
> sapply(x, quantile)   #每一个对应组件输出5个元素,所以为5行,像矩阵一样,竖着来的。
         a        beta logic
0%    1.00  0.04978707   0.0
25%   3.25  0.25160736   0.0
50%   5.50  1.00000000   0.5
75%   7.75  5.05366896   1.0
100% 10.00 20.08553692   1.0
> sapply(2:4, seq)
[[1]]
[1] 1 2

[[2]]
[1] 1 2 3

[[3]]
[1] 1 2 3 4

 

//quantile是分位数的意思。默认是计算这5个分位数。

4.tapply

tapply(x,f,g)需要向量 x (x不可以是数据框),因子或因子列表 f 以及函数 g 。
tapply()执行的操作是:暂时将x分组,每组对应一个因子水平(f),得到x的子向量,然后这些子向量应用函数 g.

> a <- c(24,25,36,37)
> b <- c(q, w, q,w)
> tapply(a, b, mean)
 q  w 
30 31 

 

先按照b分组,然后应用了mean函数。

5.mapply

> l1 <- list(a = c(1:10), b = c(11:20))
> l2 <- list(c = c(21:30), d = c(31:40))
> mapply(sum, l1$a, l1$b, l2$c, l2$d)
 [1]  64  68  72  76  80  84  88  92  96 100
> l1 <- list(a = c(1:10), b = c(11:20))
> l2 <- list(c = c(21:30), d = c(31:40))
> mapply(sum, l1$a)
 [1]  1  2  3  4  5  6  7  8  9 10
> l1 <- list(a = c(1:10), b = c(11:20))
> l2 <- list(c = c(21:30), d = c(31:40))
> mapply(sum, l1$a,l1$b)
 [1] 12 14 16 18 20 22 24 26 28 30

 

//根据这个就能比较好的看出来它的作用,先对第一个参数应用sum,再对第二个参数sum,

比如对于sum求和:第一个参数就是本参数,另一个参数就是上一次计算的结果。

多参数版本的sapply()。第一次计算传入各组向量的第一个元素到FUN,进行结算得到结果;

第二次传入各组向量的第二个元素,得到结果;第三次传入各组向量的第三个元素…以此类推。

R中apply等函数用法[转载]

上一篇:php 判断是否手机端还是pc端


下一篇:[LeetCode&Python] Problem 202. Happy Number