2016-06-17 5 views
1

У меня есть список некоторой длины (скажем, 1000). Каждый элемент списка - это еще один список length = 2. Каждый элемент нового списка является data.table. Второй элемент каждого списка может быть пустой таблицей данных.Добавление элементов списка

Мне нужно rbind() все data.frames, которые находятся в первой позиции списка. В настоящее время я делаю следующее:

DT1 = data.table() 
DT2 = data.table() 
for (i in 1:length(myList)){ 
    DT1 = rbind(DT1, myList[[i]][[1]] 
    DT2 = rbind(DT2, myList[[i]][[2]] 
} 

Это работает, но это слишком медленно. Есть ли способ избежать цикла for?

Спасибо заранее!

+0

Даже если вы можете избежать для цикла, это будет медленно, как вы растете dataframes с 'rbind' широко. – niczky12

+2

'rbindlist (lapply (mylist, \' [[\ ', 1L))'? –

+0

Большое спасибо, это работает быстрее, чем все другие предложения! Пожалуйста, опубликуйте его, чтобы я мог «принять» ваш ответ. – GerasimosPanagiotakopoulos

ответ

2

таблица данных имеет специальную функцию быстрого: rbindlist Cf: http://www.inside-r.org/packages/cran/data.table/docs/rbindlist

Отредактировано:

Ниже приведен пример кода

library(data.table)    
srcList=list(list(DT1=data.table(X=0),DT2=NULL),list(DT1=data.table(X=2),data.table(Y=3))) 
# first have a list for all DT1s 
DT1.list= lapply(srcList, FUN=function(el){el$DT1}) 
rbindlist(DT1.list) 

    X 
1: 0 
2: 2 
+0

Спасибо за ответ так быстро. Я видел эту функцию, но я не совсем понимаю, как ее можно применить для привязки к списку списков. – GerasimosPanagiotakopoulos

+0

. Чтобы сочетаться с возможностью выбора подходящего DT, например, с помощью 'lapply (myLisr, FUN = function (el) el [ [1]]) 'для создания DT1 –

+1

Выполнено. Это было бы легче, если бы мы уже определили данные игрушек. –

1

ли это:

do.call("rbind", lapply(df.list, "[[", 1)) # for first list element 

    # x y 
# 1 1 10 
# 2 2 20 
# 3 3 30 
# 4 4 40 
# 5 5 50 
# 6 6 60 

do.call("rbind", lapply(df.list, "[[", 2)) # for second list element 

    # x y 
# 1 1 30 
# 2 2 40 
# 3 3 50 
# 4 4 70 
# 5 5 80 
# 6 6 90 

DAT

df.list=list(list(structure(list(x = 1:3, y = c(10, 20, 30)), .Names = c("x", 
"y"), row.names = c(NA, -3L), class = "data.frame"), structure(list(
    x = 1:3, y = c(30, 40, 50)), .Names = c("x", "y"), row.names = c(NA, 
-3L), class = "data.frame")), list(structure(list(x = 4:6, y = c(40, 
50, 60)), .Names = c("x", "y"), row.names = c(NA, -3L), class = "data.frame"), 
    structure(list(x = 4:6, y = c(70, 80, 90)), .Names = c("x", 
    "y"), row.names = c(NA, -3L), class = "data.frame"))) 

# df.list 

# [[1]] 
# [[1]][[1]] 
    # x y 
# 1 1 10 
# 2 2 20 
# 3 3 30 

# [[1]][[2]] 
    # x y 
# 1 1 30 
# 2 2 40 
# 3 3 50 


# [[2]] 
# [[2]][[1]] 
    # x y 
# 1 4 40 
# 2 5 50 
# 3 6 60 

# [[2]][[2]] 
    # x y 
# 1 4 70 
# 2 5 80 
# 3 6 90 
+0

Благодарим вас за сообщение такого подробного и подробного ответа! – GerasimosPanagiotakopoulos

+0

@ GerasimosPanagiotakopoulos вы можете просто проголосовать вместо того, чтобы благодарить! :-) – 989

+1

Я сделал, но из-за низкой репутации он пока не может показываться. – GerasimosPanagiotakopoulos

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