2017-01-05 13 views
1

Это следующее с другого вопроса Extracting from Nested list to data frameПреобразование кадра данных с использованием имени столбца

Используя обновленный ответ я получаю мой кадр данных Начну с.

Затем я использую df <- data.frame(start = df3[5,])

Так я остался с:

dput(df) 
structure(list(start.X1_1 = structure(4L, .Names = "experience.start", .Label = c("", 
" ", "1", "2015"), class = "factor"), start.X2_2 = structure(3L, .Names = "experience.start", .Label = c(" ", 
"1", "2011"), class = "factor"), start.X3_2 = structure(3L, .Names = "experience.start", .Label = c(" ", 
"1", "2007"), class = "factor"), start.X4_2 = structure(NA_integer_, .Names = "experience.start", .Label = c(" ", 
"1"), class = "factor"), start.X5_2 = structure(NA_integer_, .Names = "experience.start", .Label = c(" ", 
"1"), class = "factor"), start.X6_2 = structure(NA_integer_, .Names = "experience.start", .Label = c(" ", 
"1"), class = "factor"), start.X7_2 = structure(NA_integer_, .Names = "experience.start", .Label = c(" ", 
"1"), class = "factor"), start.X8_2 = structure(NA_integer_, .Names = "experience.start", .Label = c(" ", 
"1"), class = "factor"), start.X9_2 = structure(NA_integer_, .Names = "experience.start", .Label = c(" ", 
"1"), class = "factor"), start.X10_3 = structure(3L, .Names = "experience.start", .Label = c(" ", 
"1", "2016", "3000"), class = "factor"), start.X11_3 = structure(3L, .Names = "experience.start", .Label = c(" ", 
"1", "2015", "3000"), class = "factor"), start.X12_3 = structure(4L, .Names = "experience.start", .Label = c("", 
" ", "1", "2015", "2016", "EE"), class = "factor"), start.X13_3 = structure(4L, .Names = "experience.start", .Label = c("", 
" ", "1", "2014", "2015"), class = "factor"), start.X14_3 = structure(3L, .Names = "experience.start", .Label = c(" ", 
"1", "2013", "2014"), class = "factor"), start.X15_3 = structure(3L, .Names = "experience.start", .Label = c(" ", 
"1", "2010", "2011", "Virtusa"), class = "factor")), .Names = c("start.X1_1", 
"start.X2_2", "start.X3_2", "start.X4_2", "start.X5_2", "start.X6_2", 
"start.X7_2", "start.X8_2", "start.X9_2", "start.X10_3", "start.X11_3", 
"start.X12_3", "start.X13_3", "start.X14_3", "start.X15_3"), row.names = "experience.start", class = "data.frame") 

Теперь я хотел бы получить в формате:

v1 v2 v3 v4 v5 v6 v7 v8 
1 2015 
2 2011 2007 null null null null null null 
3 2016 2015 2015 2015 2013 2010 

я могу использовать следующее найти столбцы, которые соответствуют

sR <- function(x, n){ 
    substr(x, nchar(x)-n+1, nchar(x))} 

sR(names(df),2) 
[1] "_1" "_2" "_2" "_2" "_2" "_2" "_2" "_2" "_2" "_3" "_3" "_3" "_3" "_3" "_3" 

Так что я думаю отсюда должен быть способ, которым я могу добраться до желаемого результата.

Или я уверен, что кто-то показать мне лучший способ

ответ

2

Основная идея заключается в том, чтобы split вашего кадра данных на основе суффикса после подчеркивания. Таким образом, вы получите список с 3-х элементами, 1 для каждого суффикса (в вашем случае 1, 2, 3)

df[] <- lapply(df[], as.character) 
l1 <- lapply(split(stack(df), as.numeric(sub('.*_', '', stack(df)[,2]))), '[', 1) 
lapply(l1, head, 2) 

#$`1` 
# values 
#1 2015 

#$`2` 
# values 
#2 2011 
#3 2007 

#$`3` 
# values 
#10 2016 
#11 2015 

Теперь все, что нам нужно сделать, это cbind этих 3 элемента вместе, который является немного сложнее, так как их длина отличается. К счастью, в SO есть большие ответы, которые мы можем использовать (см. Отказ от ответственности ниже), которые заботятся об этой проблеме.

t(do.call(cbindPad, l1)) 

#  1  2  3  4  5  6  7 8 
#values "2015" NA  NA  NA  NA  NA  NA NA 
#values "2011" "2007" NA  NA  NA  NA  NA NA 
#values "2016" "2015" "2015" "2014" "2013" "2010" NA NA 

ОТКАЗ

Функция cbindPad была взята из @ ответ Joran в this post

В качестве альтернативы, есть функция rbind.fill в plyr пакет, который может быть использован после транспозиции, чтобы дать своего рода cbind.fill результат.

plyr::rbind.fill(lapply(l1, function(i) as.data.frame(t(i)))) 

#  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
#1 2015 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 
#2 <NA> 2011 2007 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 
#3 <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> 2016 2015 2015 2014 2013 2010 
+0

Я не могу сделать первую строку: Ошибка в stack.data.frame (DF): нет векторных столбцы не были выбраны – Olivia

+1

О, вы должны преобразовать характер. Я добавлю его – Sotos

+0

в любом случае, вы можете объяснить свой ответ, мне нужно перераспределить раскол и стек, но я не люблю использовать ответы, не понимая, что происходит. Еще раз спасибо – Olivia

 Смежные вопросы

  • Нет связанных вопросов^_^