2015-02-20 6 views
0

Я использую 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), но я не могу понять, какая функция позволит мне это сделать.

Благодарим за помощь!

+2

Вы никогда не получите 'sapply', чтобы вернуть кадр данных, если вы не перепишете его. Он возвращает либо список, либо матрицу, либо атомный вектор, в зависимости от того, будет ли упрощен результат. Попробуйте 'lapply' –

+1

Используя совет @ RichardScriven, сделав что-то вроде' ret <- lapply (1: sims, function (i) {...}) ', он должен работать, чтобы следовать этому с помощью' granMat <- do.call (rbind, ret) '. Это предполагает, что все data.frames имеют одинаковые имена столбцов (как представляется, они делают), иначе вам понадобятся больше трюков. – r2evans

+0

Отлично, спасибо @RichardScriven и @ r2evans! Теперь он отлично работает! –

ответ

0
simmulations=30 
granMAT <- sapply(1:simmulations, function(i){ 
    a <- levy.walk.flights()[[1]] 
    cbind(a,rep(i, length(a[,1]))) 
}) %>% rbind_all 

rbind_all является функция стенографии от dplyr равна do.call ("rbind", список). Проводя ваши результаты из sapply в rbind_all, означает, что он возьмет список и свяжет все строки вместе, возвращая data.frame.

+0

Не могли бы вы объяснить свой код, пожалуйста? – dgilperez

 Смежные вопросы

  • Нет связанных вопросов^_^