【问题标题】:Force apply to return a list强制申请返回列表
【发布时间】:2011-06-05 05:47:45
【问题描述】:

我有一个矩阵和一个函数,它接受一个向量并返回一个矩阵。我想将该函数应用于矩阵的所有行并将所有结果合并在一起。例如

mat <- matrix(1:6, ncol=2)
f <- function (x) cbind(1:sum(x), sum(x):1)
do.call(rbind, apply(mat, 1, f))

这非常有效,因为返回的矩阵有不同的行数,所以 apply 返回一个列表。但是,如果它们碰巧有相同数量的行,这将不再起作用:

mat <- f(3)
apply(mat, 1, f)

apply 返回一个矩阵,我无法从中得到我想要的结果。是否可以强制申请返回列表或是否有其他解决方案?

【问题讨论】:

    标签: r


    【解决方案1】:

    这就是我喜欢plyr 包的原因。它有许多--ply 函数,它们都以相同的方式工作。第一个字母对应于您的输入,第二个方法对应于您的输出(l 用于列表,a 用于数组,d 用于数据帧)。

    所以alply() 函数的工作方式类似于apply(),但总是返回一个列表:

    alply(mat, 1, f)
    

    【讨论】:

      【解决方案2】:

      您必须在应用函数 f 之前拆分矩阵 mat。

      list_result <- lapply(split(mat,seq(NROW(mat))),f)
      matrix_result <- do.call(rbind,list_result)
      

      【讨论】:

      • 当你必须处理空矩阵时会遇到问题,因为 seq(0) 给出 c(1,0)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 2011-12-26
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      相关资源
      最近更新 更多