r - R 中的压缩列表

标签 r plyr lapply

作为指导,我更喜欢使用 lapply 或 *ply (来自 plyr)将函数应用于列表的元素,而不是显式地迭代它们。然而,当我必须一次处理一个列表时,这种方法很有效。当函数接受多个参数时,我通常会执行一个循环。

我想知道是否有可能有一个更干净的结构,但本质上仍然有效。一种可能的方法是定义一个类似于 Python 的函数 zip(x,y),它接受输入列表,并返回一个列表,其第 i 个元素是 list(x, y),然后将该函数应用于这份 list 。但我的问题是我是否使用了最干净的方法。我不担心性能优化,而是担心清晰度/优雅。

下面是一个简单的例子。

        A <- as.list(0:9)
        B <- as.list(0:9)
        f <- function(x, y) x^2+y

        OUT <- list()
        for (n in 1:10) OUT[[n]] <- f(A[[n]], B[[n]])
        OUT
        [[1]]
        [1] 0

        [[2]]
        [1] 2

        ...

这是压缩的示例(可以扩展到任意参数):

zip <- function(x, y){
    stopifnot(length(x)==length(y))
    z <- list()
    for (i in seq_along(x)){
        z[[i]] <- list(x[[i]], y[[i]]) 
    }
    z
}
E <- zip(A, B)

lapply(E, function(x) f(x[[1]], x[[2]]))

[[1]]
[1] 0

[[2]]
[1] 2

 ...

最佳答案

我认为您正在寻找mapply:

   ‘mapply’ is a multivariate version of ‘sapply’.  ‘mapply’ applies
     ‘FUN’ to the first elements of each ...  argument, the second
     elements, the third elements, and so on.  Arguments are recycled
     if necessary.

对于您的示例,请使用maply(f, A, B)

关于r - R 中的压缩列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6145795/

相关文章:

r - 用于按索引对向量进行分区并在该分区上执行操作的惯用 R 代码

r - 对数据帧列表进行最佳非线性拟合

r - 如何在 dplyr 工作流中为 ggplot2 的比例编写函数?

r - Strsplit 并计算出现次数

r - 设置整个 ggvis 图的高度和宽度,包括轴和轴标签

R:如何按行对矩阵中的对求和?

r - 使用 dplyr 获取零方差的列名

r - 在ggplot中使用 `facet_wrap`时如何修复x和y轴

r - 多子集延迟

r - 如何 reshape 长格式数据并计算值