20

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

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 正在返回一个列表矩阵。我期待它返回一个数据框列表。我应该怎么做?

4

2 回答 2

36

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

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

identical(class(res), "list")
[1] TRUE
于 2012-01-04T20:47:53.813 回答
5

或者,您可以使用 Map 功能。它基本上是在 SIMPLIFY 设置为 FALSE 的情况下映射的。

Map("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4)
于 2013-08-07T14:43:10.250 回答