R语言apply系列介绍

介于在网上看了很多,有些写的不够清楚,希望我下面能说清楚

1. apply

apply(data,margin,function

  • apply函数有3个参数:
    a. 第一个为输入的数据,要求为矩阵或者数据框的形式
    b. 第二个参数指的是按行还是按列来进行计算,为1时是按行进行计算,为2时是按列进行计算
    c. 第三个参数指的是使用什么函数
  • 例子
mat <- matrix(c(1,2,3,4),nrow = 2)

> mat
     [,1] [,2]
[1,]    1    3
[2,]    2    4

#按行来求和
> apply(mat,1,sum)
[1] 4 6

#按列来求和
> apply(mat,2,sum)
[1] 3 7

2. lapply

lapply(x,function)

  • lapply 有2个参数:

    a. 第一个参数是需要的数据,可以是向量或者 列表 的形式

    b. 第二个参数是函数

    注:lapply 返回的是一个列表

  • 例子
> a <- c(1,2,3)
> lapply(a, rnorm)
[[1]]
[1] 0.2791608

[[2]]
[1] -0.07617067  1.39466313

[[3]]
[1]  0.16453412  1.57785198 -0.06192266

> lapply(a, function(x) x^2) 
[[1]]
[1] 1

[[2]]
[1] 4

[[3]]
[1] 9

3.sapply

sapply(x,function)

sapplylapply其实是一样的,只是返回的结果是一个向量或者是一个矩阵,当无法将一个结果简化为矩阵时,就会返回一个列表

  • sapply 有2个参数:

    a. 第一个参数是需要的数据,一般向量,也可为列表

    b. 第二个参数是函数

    注:sapply 返回的是一个向量或矩阵

  • 例子
> sapply(1:10,function(x) x^2)
 [1]   1   4   9  16  25  36  49  64  81 100

> sapply(1:10,function(x) c(x,x^2))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    2    3    4    5    6    7    8    9    10
[2,]    1    4    9   16   25   36   49   64   81   100

#此时返回的结果是跟lapply函数是一样的,这是因为无法将一个结果简化为矩阵
> sapply(a, rnorm)
[[1]]
[1] 0.9481593

[[2]]
[1]  0.9141587 -1.2987320

[[3]]
[1]  0.4243788 -1.1125453 -1.0510732

4. vapply(sapply的安全版本)

可以发现sapply函数很灵活,既可以返回向量,又可以返回矩阵,又可以返回列表,但这种灵活有时候会有风险。vapply函数就是sapply函数的升级版本,vapply函数通过付加一个参数来设定每次返回值的模板。

vapply(x, function, FUN.VALUE)

  • 前面两个参数与sapply完全一样,就多了第三个参数,就是累设定我们返回值的模板的
  • 例子
> a <- list(c(1,2),c(2,3),c(1,3))
> sapply(a, function(x) x^2)
     [,1] [,2] [,3]
[1,]    1    4    1
[2,]    4    9    9

 #numeric(2)的意思是指定了模板numeric(2),意味着每次迭代都返回一个包含2个元素的数值向量
> vapply(a, function(x) x^2,numeric(2))   
     [,1] [,2] [,3]
[1,]    1    4    1
[2,]    4    9    9

#但是当list变成如下形式时,则会报错,这是因为我们设定了模型,当不能按照模板输出时,函数就会返回错误信息
> b <- list(c(1,2),c(2,3),c(1,3,3))
> sapply(b, function(x) x^2)
[[1]]
[1] 1 4

[[2]]
[1] 4 9

[[3]]
[1] 1 9 9

> vapply(b, function(x) x^2,numeric(2))
Error in vapply(b, function(x) x^2, numeric(2)) : 
  values must be length 2,
 but FUN(X[[3]]) result is length 3

5. mapply (sapply的多元版本)

mapply可以看做是sapply的多元版本,sapply只能在一个向来上迭代,而mapply可以在多个向量上迭代。

mapply(function(x,y) x,y)

  • 例子
> mapply(function(a,b,c) a*b + b*c + a*c,
       a = c(1,2,3),
       b = c(5,6,7),
       c = c(-1,-2,-3)
       )
       
 [1] -1 -4 -9
 
 
> df <- data.frame(x = c(1,2,3),
+                  y = c(3,4,5))
> mapply(function(xi,yi) c(xi,yi,xi+yi),df$x,df$y)
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    3    4    5
[3,]    4    6    8

6. Map(lapply的多元版本)

Maplapply的多元版本,故通常返回一个列表的形式

  • 例子
> df <- data.frame(x = c(1,2,3),
+                  y = c(3,4,5))
> Map(function(xi,yi) c(xi,yi,xi+yi),df$x,df$y)
[[1]]
[1] 1 3 4

[[2]]
[1] 2 4 6

[[3]]
[1] 3 5 8

参考资料: 任坤《R语言编程指南》

R语言中,apply函数是一个非常有用的函数,它可以对矩阵、数组、列表等数据结构进行操作,并返回结果。apply函数有几个不同的变体,包括sapply函数。 sapply函数与lapply函数类似,都是将指定的函数应用于列表、向量、表达式等,并以向量或矩阵的形式返回结果。\[2\]与lapply函数不同的是,sapply函数会尝试将结果转换为更简单的数据结构,例如向量或矩阵。如果函数的返回值是一个向量,则sapply函数返回一个包含这些值的向量。如果函数的返回值是一个大于1的向量,则sapply函数会返回一个矩阵。\[1\] 例如,我们可以使用sapply函数对iris数据集的前四列进行操作,判断每个元素是否大于3,并返回一个矩阵。代码如下: x <- sapply(iris\[,1:4\], function(x) {x > 3}) class(x) 这段代码将返回一个逻辑矩阵,其中的每个元素表示对应位置的值是否大于3。\[1\] 除了sapply函数,还有其他类似的函数,如lapply函数和vapply函数,它们也可以对列表、向量等进行操作,并返回结果。\[3\]这些函数在R语言中非常常用,可以帮助我们快速处理数据和进行统计分析。 #### 引用[.reference_title] - *1* *2* [R语言apply系列函数](https://blog.csdn.net/ouyangk1026/article/details/122535256)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [R语言:常用apply函数(apply,tapply,sapply,lapply)用法介绍](https://blog.csdn.net/qq_43407763/article/details/91652918)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值