美文网首页R语言基础
apply、lapply、sapply

apply、lapply、sapply

作者: 911c66788b0c | 来源:发表于2020-04-02 21:24 被阅读0次

apply(array, margin, ...)

基本命令格式是:apply(数据,向量,函数)
数据:通常是矩阵
向量:向量值为1指的是将函数应用到矩阵的“每一行”上,向量值为2指的是将函数应用到矩阵的“每一列”上
函数:就是我们计算的方法

分别用apply()求matrix1每一行和每一列的和(应用在多个元素上)
> l1<-c(2,3,5)
> l2<-c(12,14,18)
> matrix<-cbind(l1,l2)
> matrix
     l1 l2
[1,]  2 12
[2,]  3 14
[3,]  5 18
> matrix_a<-apply(matrix1,1,sum)
> matrix_a
[1] 14 17 23
> matrix_b<-apply(matrix1,2,sum)
> matrix_b
l1 l2 
10 44 
用apply()求v中每一个元素的平方根(应用在单一元素上)
> c1<-c(4,9,16)
> c2<-c(81,36,64)
> v<-cbind(c1,c2)
> v
     c1 c2
[1,]  4 81
[2,]  9 36
[3,] 16 64
> v_a<-apply(v,1,sqrt)
> v_a
   [,1] [,2] [,3]
c1    2    3    4
c2    9    6    8
> v_a1<-apply(v,2,sqrt)
> v_a1
     c1 c2
[1,]  2  9
[2,]  3  6
[3,]  4  8

  # 向量为1时函数的运算顺序:从第一列的第一个到第一列的最后一个,从第一列到最后一列  
  # 向量为2时函数的运算顺序:从第一行的第一个到第一行的最后一个,从第一行到最后一行
function()和apply()的集合
> v_a3<-apply(v,1,function(x)sqrt(x))
> v_a3
     [,1] [,2] [,3]
c1    2    3    4
c2    9    6    8
> v_a4<-apply(v,2,function(x)sqrt(x))
> v_a4
     c1 c2
[1,]  2  9
[2,]  3  6
[3,]  4  8
> v_a5<-apply(v,1,sum)
> v_a5
[1] 85 45 80
> v_a6<-apply(v,1,function(x)sum(x)+1)
> v_a6
[1] 86 46 81

lapply(list, function)

lapply()按列进行计算,返回的是list
我们最好先把输入的数据转化成list

> v
     c1 c2
[1,]  4 81
[2,]  9 36
[3,] 16 64
> class(v)
[1] "matrix"
> is.list(v)
[1] FALSE
> v_df<-data.frame(v)
> v_df
  c1 c2
1  4 81
2  9 36
3 16 64
> class(v_df)
[1] "data.frame"
> is.list(v_df)
[1] TRUE
> v_a0<-lapply(v_df,sqrt)
> v_a0
$c1
[1] 2 3 4

$c2
[1] 9 6 8

#那么我们现在来试一下如果输入的数据不是list会怎样
> v_a0<-lapply(v,sqrt)
> v_a0
[[1]]
[1] 2

[[2]]
[1] 3

[[3]]
[1] 4

[[4]]
[1] 9

[[5]]
[1] 6

[[6]]
[1] 8
#输出的数值一样,但是结果是6个list,一点都不好看,我们可以整合成一个
> v_a0_df<-data.frame(v_a0)
> v_a0_df
  c1 c2
1  2  9
2  3  6
3  4  8

#还可以把他们变成一行六列
> v_a0_c<-do.call(cbind,v_a0)
> v_a0_c
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    2    3    4    9    6    8
#或者变成六行一列
> v_a0_cr<-do.call(rbind,v_a0)
> v_a0_cr
     [,1]
[1,]    2
[2,]    3
[3,]    4
[4,]    9
[5,]    6
[6,]    8
#当然,这种方式没有区分c1,c2,但我们要知道lapply()是按列进行运算的
function()与lapply()整合
> v_a6<-lapply(v_df,function(x)sum(x))
> v_a6
$c1
[1] 29

$c2
[1] 181
> v_a7<-lapply(v_df,function(x)sum(x)+1)
> v_a7
$c1
[1] 30

$c2
[1] 182
> is.list(v_a7)
[1] TRUE  #输出为list
> names(v_a7)
[1] "c1" "c2"
> v_a7[1] #取v_a7中的第一个值
$c1
[1] 30
> v_a7$c1 #根据变量名字提取数值
[1] 30

sapply(list, function)

sapply与lapply运算方法一样,但是sapply()输出的是数值

> v_a0<-sapply(v,sqrt)
> v_a0
[1] 2 3 4 9 6 8

参考来源:https://zhuanlan.zhihu.com/p/26029242

终于把基本用法学会了呜呜呜这对我来说太难了我连vb都没有考过大哭

相关文章

网友评论

    本文标题:apply、lapply、sapply

    本文链接:https://www.haomeiwen.com/subject/vzlfphtx.html