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都没有考过大哭
网友评论