2015-04-29 7 views
0

У меня есть список фреймов данных, и я хочу создать новый объект фрейма данных с данными всех фреймов данных.Добавление данных Data Frame в R

Мне не нужно проверять двуличность, так как у меня нет повторения данных, но я не могу найти функцию для добавления данных из фрейма данных в другой.

я судимый использовать функции слияния следующим образом, без какого-либо Sucess:

складки представляет собой список(), где каждый элемент представляет собой кадр данных, все с той же структурой, но с различными данными.

#Copies the structure to a new Object 
    trainingSub <- folds[[1]][0,] 
    #append data 
    for(y in 1:K){ 
    if(y!=i){ 
     trainingSub <- merge(trainingSub,folds[[y]],all=TRUE) 
    } 
    } 
+0

Вы смотрели на 'rbindlist' в data.table пакете? – dayne

ответ

4

По звукам его, вы ищете классический:

do.call(rbind, folds) 

который добавит список data.frame S вместе построчно.

Если вам нужно объединить по столбцам, а не подход был бы:

do.call(cbind, folds) 
2

Как насчет этого?

do.call(rbind,folds) 
2

Вы можете попробовать использовать rbindlist:

library(data.table) 
xmpl <- list(data.frame(a = 1:3), 
      data.frame(a = 4:6), 
      data.frame(a = 7:9)) 

rbindlist(xmpl) 
# a 
# 1: 1 
# 2: 2 
# 3: 3 
# 4: 4 
# 5: 5 
# 6: 6 
# 7: 7 
# 8: 8 
# 9: 9 

rbindlist быстрее, но менее гибкий, чем do.call подход. Существует нет rbindlist эквивалент для быстрого выполнения cbind.

+2

Примечание: для этой функции требуется пакет 'data.table'. – Frank

+0

dayne, каким образом вы имеете в виду менее гибкий? – Arun

+1

деньne, так и 'do.call' .. нет? – Arun

2

dplyr и plyr альтернативы других больших подходов, перечисленных здесь:

# Using dplyr 
library(dplyr) 
data.frame(rbind_all(folds)) 

# Using plyr 
library(plyr) 
data.frame(rbind.fill(folds)) 

Они оба выполняют ту же функцию, do.call() с rbind, но предлагают некоторые улучшения производительности.

Ориентиры:

folds <- NULL 
for (i in 1:2000) { 
    folds[[i]] <- data.frame(matrix(runif(100), 10, 10)) 
} 

system.time({ x1 <- do.call(rbind, folds) }) 
# user system elapsed 
# 1.11 0.00 1.10 

system.time({ x2 <- data.frame(dplyr::rbind_all(folds)) }) 
# user system elapsed 
# 0.05 0.00 0.05 

system.time({ x3 <- data.frame(plyr::rbind.fill(folds)) }) 
# user system elapsed 
# 0.53 0.00 0.54 

system.time({ x4 <- data.frame(data.table::rbindlist(folds)) }) 
# user system elapsed 
# 0.02 0.00 0.02 

доказательство того, что все они дают одинаковый результат:

identical(x1, x2) 
# TRUE 
identical(x1, x3) 
# TRUE 
identical(x1, x4) 
# TRUE 
Смежные вопросы