Use lapply (instead of for) to just leave the common columns of multiple dataframes in a new list

2

dput of list:

structure(list(col1 = structure(list(a = 1:5, b = 1:5, c = 1:5), .Names = c("a", 
"b", "c"), row.names = c(NA, -5L), class = "data.frame"), col2 = structure(list(
    a = 6:10, c = 6:10), .Names = c("a", "c"), row.names = c(NA, 
-5L), class = "data.frame"), col3 = structure(list(a = 11:15, 
    c = 11:15), .Names = c("a", "c"), row.names = c(NA, -5L), class = "data.frame"), 
    col4 = structure(list(a = 16:20, b = 16:20), .Names = c("a", 
    "b"), row.names = c(NA, -5L), class = "data.frame"), col5 = structure(list(
        a = 21:25, c = 21:25), .Names = c("a", "c"), row.names = c(NA, 
    -5L), class = "data.frame")), .Names = c("col1", "col2", 
"col3", "col4", "col5"))

The only common column between them is a .

I tried to do the following:

newlist<-lapply(1:length(list),function(x)colnames(x))

But% is returned%.

I also tried using NULL (with lapply) to aggregate these dataframes (considering merge ), but without success.

    
asked by anonymous 07.09.2018 / 23:12

1 answer

1

Use the plyr package to merge the original list into a data frame:

library(plyr)
res <- ldply(dados, data.frame)

res is a data frame with 3 columns: a , b and c . Since b and c are not present in all elements of dados , they have NA . The select_if function of dplyr allows us to select only columns of res such that all elements are NA :

library(dplyr)
res <- res %>%
  select_if(~ !any(is.na(.)))

Now just separate the res without NA using the split function. It will separate all columns other than the .id column into a new list:

split(res[, -1], res$.id)
    
07.09.2018 / 23:54