A tidyverse
решение на основе списка stacking
и последующее распространение data.frame
с использованием 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>
Данные: Исправленные данные взяты из @r2evans
ответа.
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(""))