【问题标题】:Force mapply to return a list?强制mapply返回一个列表?
【发布时间】:2012-01-04 20:36:58
【问题描述】:

假设我有一个创建数据框的函数。我想用不同的输入值运行该函数,然后将结果合并到一个大数据框中,如下所示:

CreateDataFrame <- function(type="A", n=10, n.true=8) {
  data.frame(success=c(rep(TRUE, n.true), rep(FALSE, n - n.true)), type=type)
}
df <- do.call(rbind, lapply(toupper(letters[1:5]), CreateDataFrame))

我的 CreateDataFrame 函数接受三个参数。在上面的示例中,第二个和第三个参数保持不变。我想做和上面一样的事情,但是每次调用都会改变第二个和第三个参数。我想我必须使用mapply,像这样:

mapply("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4)

我遇到了麻烦,因为 mapply 没有返回列表,这使我无法运行 do.call(rbind, mapply(...))。我怎样才能像顶部示例中那样以单个数据框结束?

看起来像 mapply 正在返回一个列表矩阵。我期待它返回一个数据框列表。我应该怎么做?

【问题讨论】:

    标签: r mapply


    【解决方案1】:

    要获取 data.frames 列表作为返回值,请将 mapply 的 SIMPLIFY 参数设置为 FALSE。 (它的默认值是TRUE,它指示函数“尝试将结果简化为向量、矩阵或更高维数组”——这正是您所经历的)。

    res <- mapply("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4, 
                  SIMPLIFY = FALSE)
    
    identical(class(res), "list")
    [1] TRUE
    

    【讨论】:

    • 谢谢!回想起来,我应该更仔细地阅读手册。
    • 没问题。我花了很长时间才知道,每当我发现自己在想“如果函数 X 做 Y 会不会很好”,那么函数的创建者很有可能已经超越了我的想法!
    • 它太笨了,简化需要大写。它的形式与 sapply 组函数不匹配
    【解决方案2】:

    您也可以使用地图功能。它基本上是在 SIMPLIFY 设置为 FALSE 的情况下映射的。

    Map("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4)
    

    【讨论】:

    • 那怎么样。每天学习新东西
    • 我不知道!所以我查了代码,你说得对。 &gt; Map function (f, ...) { f &lt;- match.fun(f) mapply(FUN = f, ..., SIMPLIFY = FALSE) }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 2022-06-15
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多