apply函数族
apply函数族是R语言中帮助用户实现高效的向量化运算的一系列函数,包括apply,lapply,sapply,vapply等。
apply()
apply函数以列或行为单位进行循环操作,可以处理matrix、array数据,返回一个向量或matrix。
apply(data,1/2,fuction)
apply函数有三个参数,第一个参数传入环境中已有的数据;第二个参数只能传入1或2,1代表按行处理,2代表按列处理;第三个参数传入一个函数,对数据进行相应的处理。
#求mtcars数据框中每一列的平均值
> apply(mtcars, 2, mean)
mpg cyl disp hp drat wt qsec vs am gear carb
20.090625 6.187500 230.721875 146.687500 3.596563 3.217250 17.848750 0.437500 0.406250 3.687500 2.812500
lapply()
lapply函数是list apply的缩写,处理list数据,返回一个list。因为列表来者不拒,什么数据都能放,所以lapply的应用场景较多。但是,用mean,sum等处理数值型数据的函数来处理list中的逻辑型、字符型数据是有问题的,返回NA。
lapply(data,fuction)
lapply函数有两个参数,第一个参数传入环境中已有的列表;第二个参数传入一个函数。
#新建一个列表,保存着mtcars数据集、字符型向量、整型向量三组数据
df_list <- list(
data1=mtcars,
data2=c('a','b','c'),
data3=c(1:20)
)
#求列表中三组数据的最大值
> lapply(df_list,max)
$data1
[1] 472
$data2
[1] "c"
$data3
[1] 20
#求列表中三组数据的平均值
> lapply(df_list,mean)
$data1
[1] NA
$data2
[1] NA
$data3
[1] 10.5
Warning messages:
1: In mean.default(X[[i]], ...) : 参数不是数值也不是逻辑值:回覆NA
2: In mean.default(X[[i]], ...) : 参数不是数值也不是逻辑值:回覆NA
sapply()
sapply函数是对lapply处理结果的向量化保存,处理list数据,返回一个向量。
sapply(data,fuction)
sapply函数有两个参数,第一个参数传入环境中已有的列表;第二个参数传入一个函数。
> sapply(df_list, max)
data1 data2 data3
"472" "c" "20"
> sapply(df_list, mean)
data1 data2 data3
NA NA 10.5
Warning messages:
1: In mean.default(X[[i]], ...) : 参数不是数值也不是逻辑值:回覆NA
2: In mean.default(X[[i]], ...) : 参数不是数值也不是逻辑值:回覆NA
sapply函数还有一个参数simplify,默认值为TRUE,设置为FALSE的话跟lapply的结果就完全一样了,这样看来,lappy和sapply记住一个sapply就好了。
> sapply(df_list, max,simplify = FALSE)
$data1
[1] 472
$data2
[1] "c"
$data3
[1] 20
除了上述三个函数,apply函数族中还有vapply、mapply等函数,不过这三个函数在绝大多数应用场景中应该够用了,按行或列处理数组时用apply,处理list时用sapply,其他的需要的时候再看了。
详细见下表:
函数 | 用法 | 输入 | 输出 | 语法 |
---|---|---|---|---|
apply | 对阵列行或者列使用函数 | Array | Array/List | apply(X, MARGIN, FUN, …) |
lapply | 对列表或者向量使用函数 | List/expression | List | lapply(X, FUN, …) |
sapply | 对列表或者向量使用函数 | List/expression | List/Array | sapply(X, FUN, …, simplify = TRUE, USE.NAMES = TRUE) |
vapply | 对列表或者向量使用函数 | List/expression | Array | vapply(X, FUN, FUN.VALUE, …, USE.NAMES = TRUE) |
tapply | 对不规则阵列使用函数 | Array | Array/List | tapply(X, INDEX, FUN = NULL, …, simplify = TRUE) |
eapply | 对环境中的值使用函数 | Values in an Environment | List | eapply(env, FUN, …, all.names = FALSE, USE.NAMES = TRUE) |
mapply | 对多个列表或者向量参数使用函数 | List/Array | List/Array | mapply(FUN, …, MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE) |
rapply | 运用函数递归产生列表 | List | List/Vector | rapply(object, f, classes = “ANY”, deflt = NULL,how = c(“unlist”, “replace”, “list”), …) |