Вывести команду mapply для возврата списка?
Предположим, что у меня есть функция, которая создает кадры данных. Я хотел бы запустить эту функцию с различными входными значениями, а затем объединить результаты вместе в один большой фрейм данных, как показано ниже:
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 возвращает матрицу списков. Я ожидал, что он вернет список кадров данных. Что мне делать по-другому?
Ответы
Ответ 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
Ответ 2
Альтернативу вы можете использовать функцию Map. Это, в основном, mapply, когда параметр SIMPLIFY установлен в FALSE.
Map("CreateDataFrame", type=toupper(letters[1:5]), n=10, n.true=8:4)