Я использую sapply()
, чтобы генерировать 30 случайных блужданий, используя функцию моего собственного имени levy.walk.flights()
.Как получить фрейм данных из функции sapply?
simmulations=30
granMAT <- sapply(1:simmulations, function(i){
a <- levy.walk.flights()[[1]]
cbind(a,rep(i, length(a[,1])))
})
Объект a
получает data.frame
с 2 колонки: X, Y; плюс столбец идентификатора, который привязан к следующей строке кода.
Этот код отлично работает и производит все 30 симуляций. Единственная проблема заключается в том, что sapply()
возвращает список массивов 30 * 3 (90). См. Пример str(granMAT)
с 3 симуляциями.
List of 9
$ : num [1:5748] 0 0.00357 0.0074 0.01071 0.01418 ...
$ : num [1:5748] 0 0.135 0.28 0.406 0.537 ...
$ : int [1:5748] 1 1 1 1 1 1 1 1 1 1 ...
$ : num [1:2434] 0 -0.131 -0.261 -0.385 -0.527 ...
$ : num [1:2434] 0 -0.048 -0.0955 -0.1412 -0.1933 ...
$ : int [1:2434] 2 2 2 2 2 2 2 2 2 2 ...
$ : num [1:2301] 0 -0.0887 -0.1829 -0.276 -0.364 ...
$ : num [1:2301] 0 0.0941 0.1939 0.2927 0.386 ...
$ : int [1:2301] 3 3 3 3 3 3 3 3 3 3 ...
- attr(*, "dim")= int [1:2] 3 3
- attr(*, "dimnames")=List of 2
..$ : chr [1:3] "x" "y" "rep(i, length(a[, 1]))"
..$ : NULL`
Я хотел бы, чтобы sapply()
возвращать data.frame
с 3 колонки: х, у, ID. И все данные rbinded ниже этих 3 столбцов. Я пробовал do.call()
и несколько функций library(plyr)
, но я не могу понять, какая функция позволит мне это сделать.
Благодарим за помощь!
Вы никогда не получите 'sapply', чтобы вернуть кадр данных, если вы не перепишете его. Он возвращает либо список, либо матрицу, либо атомный вектор, в зависимости от того, будет ли упрощен результат. Попробуйте 'lapply' –
Используя совет @ RichardScriven, сделав что-то вроде' ret <- lapply (1: sims, function (i) {...}) ', он должен работать, чтобы следовать этому с помощью' granMat <- do.call (rbind, ret) '. Это предполагает, что все data.frames имеют одинаковые имена столбцов (как представляется, они делают), иначе вам понадобятся больше трюков. – r2evans
Отлично, спасибо @RichardScriven и @ r2evans! Теперь он отлично работает! –