每当我想在 R 中执行 \'map\'py 操作时,我通常会尝试使用 apply 系列中的函数。但是,我从未完全理解它们之间的区别 -- 如何 {sapply、lapply 等}...
每当我想在 R 中执行某些\'map\'py 操作时,我通常会尝试使用该 apply
系列中的函数。
然而,我从来没有完全理解它们之间的区别——{ sapply
, lapply
等} 如何将函数应用于输入/分组输入,输出会是什么样子,甚至输入可以是什么——所以我经常只是仔细检查它们直到得到我想要的。
有人可以解释一下何时如何使用哪一个吗?
我目前的理解(可能不正确/不完整)是......
p5
p6
apply(matrix, 1/2, f)
:输入是一个矩阵。输出是一个向量,其中元素 i
是 f(矩阵的第 i 行/第 i 列)
tapply(vector, grouping, f)
:输出是一个矩阵/数组,其中矩阵/数组中的元素是 f
向量分组 g
,并 g
被推送到行/列名称
by(dataframe, grouping, f)
:设为 g
分组。应用于 f
组/数据框的每一列。漂亮地打印分组和 f
每列的值。
aggregate(matrix, grouping, f)
:类似于 by
,但聚合不会漂亮地打印输出,而是将所有内容粘贴到数据框中。
附带问题:我还没有学过 plyr 或 reshape - 是否会 plyr
完全 reshape
取代这些?
一些软件包中也存在一些替代方案,上面没有讨论过。
中的函数 parApply()
为 parallels
在集群上执行并行计算提供了 apply 系列函数的替代方案。R 中并行计算的其他替代方案包括包 foreach
和 doParallel
包,它们允许并行执行循环和函数。 future
包提供了一个简单而一致的 API 来使用 Future,这是一种异步评估表达式的方法,可以并行或顺序进行。此外,包还提供 purrr
了一种函数式编程方法来进行迭代和映射,并通过 future
包支持并行化。
以下是一些示例
library(parallel)
# Create a matrix
m <- matrix(1:20, nrow = 5)
# Define a function to apply to each column of the matrix
my_fun <- function(x) {
x^2
}
# Apply the function to each column of the matrix in parallel
result <- parApply(cl = makeCluster(2), X = m, MARGIN = 2, FUN = my_fun)
# View the result
result
library(foreach)
library(doParallel)
# Register a parallel backend
registerDoParallel(cores = 2)
# Create a list of numbers
my_list <- list(1, 2, 3, 4, 5)
# Define a function to apply to each element of the list
my_fun <- function(x) {
x^2
}
# Apply the function to each element of the list in parallel
result <- foreach(i = my_list) %dopar% my_fun(i)
# View the result
result
library(future)
# Plan to use a parallel backend
plan(multisession, workers = 2)
# Create a list of numbers
my_list <- list(1, 2, 3, 4, 5)
# Define a function to apply to each element of the list
my_fun <- function(x) {
x^2
}
# Apply the function to each element of the list in parallel using futures
result <- future_map(my_list, my_fun)
# View the result
result
library(purrr)
library(future)
# Plan to use a parallel backend
plan(multisession, workers = 2)
# Create a list of numbers
my_list <- list(1, 2, 3, 4, 5)
# Define a function to apply to each element of the list
my_fun <- function(x) {
x^2
}
# Apply the function to each element of the list in parallel using purrr
result <- future_map(my_list, my_fun)
# View the result
result
编辑于 2023-07-02( 未来 作者):用以下代码替换已弃用且不再存在的 multiprocess
未来 后端: multisession
.