Luke
Luke

Reputation: 1

Get list to dataframe with uneven row lenghts

There is a list made from many dataframes of uneven row lengths. The column names is always iterating : name, var, name.1, var.1 etc. And sometimes there are columns with just 1 row and NA. Q: How to match all of them together?

 myData<-list(name=c("1","2","3","4","5","6","7"),var=c(5,5,5,5,5,5,5),     name=c(1,2,3,4,5,6,7),var=c(2,2,2,2,2,2),name=c(1,2,3,4,5,6),var=c(5,5,5,4,5),name=c(""),var=c(""))

The final outcome would look like this:

  name var name.1 var.1 name.2 var.2 name.3 var.3 …
1  1    5    1      2    1      5    [NA]    [NA] …
2  2    5    2      2    2      5  
3  3
.
.

Upvotes: 0

Views: 68

Answers (2)

MKR
MKR

Reputation: 20095

A tidyverse based solution by stacking list and then spreading data.frame using tidyr::spread.

library(tidyverse)

stack(myData) %>% mutate(ind = as.character(ind)) %>%
  group_by(grp = cumsum(ind != lag(ind, default="")) ) %>%
  mutate(ind = paste(ind, (grp+1) %/%2, sep="."), rn = row_number()) %>%
  ungroup() %>% select(-grp) %>%
  spread(ind, values) %>%
  select(-rn) %>% as.data.frame()


#   name.1 name.2 name.3 name.4 var.1 var.2 var.3 var.4
# 1      1      1      1            5     2     5      
# 2      2      2      2   <NA>     5     2     5  <NA>
# 3      3      3      3   <NA>     5     2     5  <NA>
# 4      4      4      4   <NA>     5     2     4  <NA>
# 5      5      5      5   <NA>     5     2     5  <NA>
# 6      6      6      6   <NA>     5     2  <NA>  <NA>
# 7      7      7   <NA>   <NA>     5  <NA>  <NA>  <NA>

Data: Corrected data taken from @r2evans answer.

myData<-list(name=c("1","2","3","4","5","6","7"),
             var=c(5,5,5,5,5,5,5),
             name=c(1,2,3,4,5,6,7),
             var=c(2,2,2,2,2,2),
             name=c(1,2,3,4,5,6),
             var=c(5,5,5,4,5),name=c(""),var=c(""))

Upvotes: 1

r2evans
r2evans

Reputation: 160577

Fixed data:

myData<-list(name=c("1","2","3","4","5","6","7"),var=c(5,5,5,5,5,5,5),     name=c(1,2,3,4,5,6,7),var=c(2,2,2,2,2,2),name=c(1,2,3,4,5,6),var=c(5,5,5,4,5),name=c(""),var=c(""))

Working solution:

( maxlen <- max(lengths(myData)) )
# [1] 7
data.frame(lapply(myData, `length<-`, maxlen))
#   name var name.1 var.1 name.2 var.2 name.3 var.3
# 1    1   5      1     2      1     5             
# 2    2   5      2     2      2     5   <NA>  <NA>
# 3    3   5      3     2      3     5   <NA>  <NA>
# 4    4   5      4     2      4     4   <NA>  <NA>
# 5    5   5      5     2      5     5   <NA>  <NA>
# 6    6   5      6     2      6    NA   <NA>  <NA>
# 7    7   5      7    NA     NA    NA   <NA>  <NA>

Upvotes: 2

Related Questions