Преобразуйте список кадров данных в один кадр данных

У меня есть код, который в одном месте заканчивается со списком кадров данных, которые я действительно хочу преобразовать в единственный кадр больших данных.

Я получил некоторые указатели от более раннего вопроса, который пытался сделать что-то подобное, но более сложное.

Вот пример того, что я запускаю с (это чрезвычайно упрощено для иллюстрации):

listOfDataFrames <- vector(mode = "list", length = 100)

for (i in 1:100) {
    listOfDataFrames[[i]] <- data.frame(a=sample(letters, 500, rep=T),
                             b=rnorm(500), c=rnorm(500))
}

Я в настоящее время использую это:

  df <- do.call("rbind", listOfDataFrames)

297
задан Community 23 May 2017 в 02:34
поделиться

1 ответ

Другой вариант - использовать функцию plyr:

df <- ldply(listOfDataFrames, data.frame)

Это немного медленнее, чем оригинал:

> system.time({ df <- do.call("rbind", listOfDataFrames) })
   user  system elapsed 
   0.25    0.00    0.25 
> system.time({ df2 <- ldply(listOfDataFrames, data.frame) })
   user  system elapsed 
   0.30    0.00    0.29
> identical(df, df2)
[1] TRUE

Я думаю, что использование do.call("rbind", ...) будет самым быстрым подходом, который вы найдете, если только вы не сможете сделать что-то вроде (a) использования матриц вместо data.frames и (b) предварительного выделения конечной матрицы и присвоения ей, а не ее роста.

Edit 1:

Основываясь на комментарии Хэдли, вот последняя версия rbind.fill из CRAN:

> system.time({ df3 <- rbind.fill(listOfDataFrames) })
   user  system elapsed 
   0.24    0.00    0.23 
> identical(df, df3)
[1] TRUE

Это проще, чем rbind, и немного быстрее (эти временные показатели сохраняются в течение нескольких запусков). И насколько я понимаю, версия plyr на github даже быстрее, чем эта.

181
ответ дан 23 November 2019 в 01:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: