2017-01-11 16 views
2

Я рассмотрел различные вопросы переплетного списка, такие как this, но я не могу найти более эффективный способ сделать это.rbind dataframes через вложенные списки

У меня есть вложенный список nestlist, который содержит три списка, которые каждый из которых содержат два dataframes:

df1 <- data.frame(ID = paste0(LETTERS[1:4],1:4), valueA = seq(0.1,0.4,0.1), Category= "Apples") 
df2 <- data.frame(ID = paste0(LETTERS[1:4],1:4), valueB = seq(0.1,0.4,0.1), Category= "Apples") 
list1 <- list(df1,df2) 

df3 <- data.frame(ID = paste0(LETTERS[1:4],1:4), valueA = seq(0.1,0.4,0.1), Category= "Pears") 
df4 <- data.frame(ID = paste0(LETTERS[1:4],1:4), valueB = seq(0.1,0.4,0.1), Category= "Pears") 
list2 <- list(df3,df4) 

df5 <- data.frame(ID = paste0(LETTERS[1:4],1:4), valueA = seq(0.1,0.4,0.1), Category= "Stairs") 
df6 <- data.frame(ID = paste0(LETTERS[1:4],1:4), valueB = seq(0.1,0.4,0.1), Category= "Stairs") 
list3 <- list(df5,df6) 

nestedlist <- list(list1,list2,list3) 

Я хочу, чтобы найти простой способ rbind каждый объект из список1, list2 и списка 3 в общей value колонки так что я в конечном итоге с:

rbind(nestedlist[[1]][[1]],nestedlist[[2]][[1]], nestedlist[[3]][[1]]) 

    ID A Category 
1 A1 0.1 Apples 
2 B2 0.2 Apples 
3 C3 0.3 Apples 
4 D4 0.4 Apples 
5 A1 0.1 Pears 
6 B2 0.2 Pears 
7 C3 0.3 Pears 
8 D4 0.4 Pears 
9 A1 0.1 Stairs 
10 B2 0.2 Stairs 
11 C3 0.3 Stairs 
12 D4 0.4 Stairs 

ответ

3

Вы можете использовать do.call(Map, ...), это передает вложенные списки в качестве аргументов к карте, которая будет цикл через эти списки параллельно и вызвать rbind как функция Map будет связывать списки на тех же позициях вместе:

do.call(Map, c(f = rbind, nestedlist)) 

# [[1]] 
# ID valueA Category 
# 1 A1 0.1 Apples 
# 2 B2 0.2 Apples 
# 3 C3 0.3 Apples 
# 4 D4 0.4 Apples 
# 5 A1 0.1 Pears 
# 6 B2 0.2 Pears 
# 7 C3 0.3 Pears 
# 8 D4 0.4 Pears 
# 9 A1 0.1 Stairs 
# 10 B2 0.2 Stairs 
# 11 C3 0.3 Stairs 
# 12 D4 0.4 Stairs 
# 
# [[2]] 
# ID valueB Category 
# 1 A1 0.1 Apples 
# 2 B2 0.2 Apples 
# 3 C3 0.3 Apples 
# 4 D4 0.4 Apples 
# 5 A1 0.1 Pears 
# 6 B2 0.2 Pears 
# 7 C3 0.3 Pears 
# 8 D4 0.4 Pears 
# 9 A1 0.1 Stairs 
# 10 B2 0.2 Stairs 
# 11 C3 0.3 Stairs 
# 12 D4 0.4 Stairs 
+0

Мне очень нравится это решение - простое и эффективный - спасибо! Интересно, быстрее ли это решение @akrun? – Bonono

1

Мы можем попробовать

library(purrr) 
lapply(transpose(nestedlist), function(x) do.call(rbind, x)) 

Или используйте bind_rows из dplyr

library(dplyr) 
transpose(nestedlist) %>% 
       map(bind_rows) 
#[[1]] 
# ID valueA Category 
#1 A1 0.1 Apples 
#2 B2 0.2 Apples 
#3 C3 0.3 Apples 
#4 D4 0.4 Apples 
#5 A1 0.1 Pears 
#6 B2 0.2 Pears 
#7 C3 0.3 Pears 
#8 D4 0.4 Pears 
#9 A1 0.1 Stairs 
#10 B2 0.2 Stairs 
#11 C3 0.3 Stairs 
#12 D4 0.4 Stairs 

#[[2]] 
# ID valueB Category 
#1 A1 0.1 Apples 
#2 B2 0.2 Apples 
#3 C3 0.3 Apples 
#4 D4 0.4 Apples 
#5 A1 0.1 Pears 
#6 B2 0.2 Pears 
#7 C3 0.3 Pears 
#8 D4 0.4 Pears 
#9 A1 0.1 Stairs 
#10 B2 0.2 Stairs 
#11 C3 0.3 Stairs 
#12 D4 0.4 Stairs