Creating a data frame from list values

I have the following list:

peter <- data.frame(year = 1:5, a = rnorm(5), b = rnorm(5)) john <- data.frame(year = 1:5, a = rnorm(5), b = rnorm(5)) myList <- list(peter, john) names(myList) <- c("peter", "john") myList $peter year ab 1 1.01464245 0.2490931 2 1.38054309 0.8396630 3 -0.84094830 0.2410526 4 -0.05567379 0.6369121 5 -0.66412862 1.5739672 $john year ab 1 0.3060996 -0.4256702 2 0.7167710 -0.6828029 3 -0.6896138 0.6577422 4 -1.7647412 -0.5651756 5 0.3065734 -0.4860141 

How to convert myList to the following data frame:

  year student ab 1 1 peter 1.01464245 0.2490931 2 2 peter 1.38054309 0.8396630 3 3 peter -0.84094830 0.2410526 4 4 peter -0.05567379 0.6369121 5 5 peter -0.66412862 1.5739672 6 1 john 0.30609964 -0.4256702 7 2 john 0.71677097 -0.6828029 8 3 john -0.68961377 0.6577422 9 4 john -1.76474117 -0.5651756 10 5 john 0.30657340 -0.4860141 

Many thanks.

+2
source share
4 answers
 library(plyr) dat <- ldply(myList) colnames(dat) <- c("student", "year", "a", "b") print(dat) ## student year ab ## 1 peter 1 0.03716519 0.8465317 ## 2 peter 2 -1.15449127 1.5461944 ## 3 peter 3 0.15933780 0.7468312 ## 4 peter 4 0.91745104 0.1113958 ## 5 peter 5 -0.22924789 -0.5344617 ## 6 john 1 0.40790134 0.5886599 ## 7 john 2 -0.88635369 -0.3596063 ## 8 john 3 -1.16444277 1.1080161 ## 9 john 4 -0.19082412 0.1675609 ## 10 john 5 1.19066829 -0.8855810 
+5
source

Like Ben, only a little different.

 dd <- do.call(rbind, myList) cbind(dd[1], student = sub("[.].*", "", rownames(dd)), dd[2:3], row.names = NULL) # year student ab # 1 1 peter -1.66983899 0.3683629 # 2 2 peter 0.25391016 -0.4999335 # 3 3 peter -0.19102468 -0.9344484 # 4 4 peter 1.72821089 -2.6148841 # 5 5 peter 0.30320439 -0.2602509 # 6 1 john -0.02447092 -0.2396401 # 7 2 john -1.57022813 1.1159078 # 8 3 john 2.82545689 0.6818537 # 9 4 john -0.11273218 -1.8000738 # 10 5 john -1.39706920 0.1647720 

September 16, 2015 Patch . Improvement to my previous answer:

 f <- function(x, y) cbind(x[1], student = y, x[-1]) do.call(rbind, Map(f, myList, names(myList), USE.NAMES = FALSE)) 
+3
source

Another alternative (very similar to Ben)

 > df <- do.call(rbind, myList) > df <- transform(df, student=sub("\\.[0-9]", "", rownames(df)))[, c("year", "student", "a", "b")] > rownames(df)<- NULL > df year student ab 1 1 peter -0.71040656 -0.04502772 2 2 peter 0.25688371 -0.78490447 3 3 peter -0.24669188 -1.66794194 4 4 peter -0.34754260 -0.38022652 5 5 peter -0.95161857 0.91899661 6 1 john -0.57534696 0.30115336 7 2 john 0.60796432 0.10567619 8 3 john -1.61788271 -0.64070601 9 4 john -0.05556197 -0.84970435 10 5 john 0.51940720 -1.02412879 
+3
source

A little cumbersome, but:

 peter <- data.frame(year = 1:5, a = rnorm(5), b = rnorm(5)) john <- data.frame(year = 1:5, a = rnorm(5), b = rnorm(5)) myList <- list(peter=peter, john=john) do.call(rbind, mapply(function(student,d) { data.frame(student,d) }, names(myList),myList,SIMPLIFY=FALSE)) 
  • define a function that creates a data frame from the student’s name and student information;
  • pass it to mapply() (using SIMPLIFY=FALSE ) to get a list of extended data frames;
  • do.call(rbind,...) to combine fragments.

As an alternative:

 info <- do.call(rbind,myList) student <- rep(names(myList),sapply(myList,nrow)) data.frame(student,info) 
+2
source

Source: https://habr.com/ru/post/1203691/


All Articles