2017-01-11 5 views
2

Ich habe mir verschiedene Fragen zur rbinding Liste wie this angesehen, aber ich kann nicht wirklich einen effizienteren Weg finden, dies zu tun.rbind Datenrahmen über verschachtelte Listen

Ich habe eine verschachtelte Liste nestlist, die drei Listen enthält, die jeweils zwei Datenrahmen enthalten:

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) 

Ich möchte einen einfacheren Weg finden, um jedes Objekt aus list1, list2 und Liste 3 durch die gemeinsame value Spalte rbind so dass ich am Ende mit:

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 

Antwort

3

können Sie do.call(Map, ...) verwenden, gibt diese die verschachtelten Listen als Argumente, die Schleife durch diese Listen in einer parallelen Art und Weise und rufen wird zur Karte rbind als Map Funktion Listen an den gleichen Positionen binden zusammen:

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

Ich mag diese Lösung - einfach und effizient - danke! Ich frage mich, ob es schneller als @akrun Lösung ist – Bonono

1

Wir versuchen

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

Oder nutzen bind_rows von 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