apply家族函数:提供强大而方便的循环功能
apply, lapply, sapply, vapply, tapply
apply
对矩阵的行或列使用函数,或者对数组的各个维度使用函数
apply(X, MARGIN, FUN, ...)
- X 矩阵或数组
- MARGIN 1代表行;2代表列
- FUN 系统自带的函数,或自定义的函数
输出:向量或矩阵
lapply
对列表中的各个元素使用函数
lapply(X, FUN, ...)
- X 列表
- FUN 系统自带的函数,或自定义的函数
输出:列表
任务:
提取出列表中的元素。
方法1:
先定义一个函数,然后再 lapply 里面使用它。
# Define get_timestamp()
get_timestamp <- function(x) {
x$timestamp
}
# Apply get_timestamp() over all elements in logs
lapply(logs, get_timestamp)
方法2:
匿名函数,直接将函数写在 lapply 里面。
注意:不要忘记写 { }。
lapply(logs, function(x) {x$timestamp})
方法3:
'[['
本身就是一个提取元素的函数,可以直接使用。
lapply(logs, '[[', "timestamp")
补充:
'[['
函数的使用
x <- list(a = 1, b = 2, c = 3)
x[["a"]]
`[[`(x, "a")
sapply
与 lapply 唯一的不同:输出的结果是1个向量
simplify the lapply result to a vector
如果 lapply 的结果的长度不一致,那么 sapply 的结果也是一个list, 和 lapply 一样。
In some cases, sapply() can simplify to a vector. In other cases, it can’t, and you get the same result lapply() would have returned.
vapply
vapply 和 sapply 很像,但是需要指出结果的格式。例如, numeric(3) character(2)。括号里面的数字代表结果的长度 length。如果指定的长度和实际结果不符,那么就会报错 error。因此,vapply 比 sapply 更安全。
sapply(logs, length)
vapply(logs, length, integer(1))
sapply(logs, `[[`, "success")
vapply(logs, `[[`, logical(1), "success")
注意: logical(1)
的位置在 function 后面。
vapply(X, FUN, FUN.VALUE)
如果结果可以 simplify, 就用 vapply
,否则,用 lapply
。
分组数据处理函数(tapply, by, aggregate)
三个函数的结果呈现方式不同
解决的问题: sex变量,男女的收入总和
reference
B站上视频 阿雷边学边教R语言
https://www.bilibili.com/video/av6768370?from=search&seid=9621515712147171753
https://www.bilibili.com/video/av6826857/?spm_id_from=333.788.videocard.0
https://campus.datacamp.com/courses/intermediate-r-practice