#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