Reputation: 1
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
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
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