R объединить список в определенный формат таблицы

#list #r

#Список #r

Вопрос:

У меня есть список, состоящий из вложенных списков с разным количеством записей, следующим образом:

 x <- list(
  c("a1", "a2", "a3", "a4", "a5", "a6", "a7"),
  c("b1","b2","b3","b4"),
  c("c1","c2","c3"),
  c("d1")
)
  

Я хочу преобразовать этот файл во фрейм данных с тремя столбцами (1-й столбец — это последовательность вложенного списка, т. е. от 1 до 4: 2-й столбец — это записи; 3-й обозначает мой код остановки, поэтому я использовал 1 для каждой строки, конечные результаты следующие:

 1  a1  1
1  a2  1
1  a3  1
1  a4  1
1  a5  1
1  a6  1
1  a7  1
2  b1  1
2  b2  1
2  b3  1
2  b4  1
3  c1  1
3  c2  1
3  c3  1
4  d1  1
  

Я пытался использовать cbind, однако, мне кажется, это работает только для вложенного списка с одинаковым количеством записей. Есть ли какой-нибудь более разумный способ сделать это?

Ответ №1:

вот пример:

 data.frame(
  x=rep(1:length(x), sapply(x, length)),
  y=unlist(x),
  z=1
)
  

Ответ №2:

 library(reshape2)

x <- melt(x) ## Done...

## Trivial...
x$stop <- 1
x <- x[c(2,1,3)]
  

Комментарии:

1. Вы, вероятно, имели в виду library(reshape2)

2. reshape2 это обновление reshape , которое выполняется значительно быстрее.

3. Да, спасибо! Теперь они автоматически загружаются из моего профиля, поэтому я редко вызываю их вручную!

4. Приятно слышать, что reshape2 быстрее, чем reshape. Все ли оригинальные функции в reshape имеют улучшения в reshape2?

Ответ №3:

Одним из вариантов является использование функций разделения, применения, объединения в пакете plyr . В этом случае вам понадобится ldply который возьмет список и объединит элементы в data.frame:

 library(plyr)
ldply(seq_along(x), function(i)data.frame(n=i, x=x[[i]], stop=1))

   n  x stop
1  1 a1    1
2  1 a2    1
3  1 a3    1
4  1 a4    1
5  1 a5    1
6  1 a6    1
7  1 a7    1
8  2 b1    1
9  2 b2    1
10 2 b3    1
11 2 b4    1
12 3 c1    1
13 3 c2    1
14 3 c3    1
15 4 d1    1