Получить список для данных с неравной длиной строки - PullRequest
0 голосов
/ 02 июня 2018

Существует список, составленный из множества информационных кадров с неравной длиной строки.Имена столбцов всегда повторяются: name, var, name.1, var.1 и т. Д. И иногда встречаются столбцы с одной строкой и NA.В: Как сопоставить их все вместе?

 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(""))

Конечный результат будет выглядеть так:

  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
.
.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

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(""))
0 голосов
/ 02 июня 2018

Фиксированные данные:

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(""))

Рабочий раствор:

( 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>
...