2014-10-04 3 views
5

У меня есть вложенный список:R: Преобразование вложенного списка dataframe и получить имена уровней списка ALS факторов

list1 <- list("A"=c(1,1,1), "B"=c(2,2,2), "C"=c(3,3,3)) 
list2 <- list("F1" = list1, "F2" = list1) 

, и я хотел бы, чтобы получить последний уровень списка (содержащий вектор) в виде dataframe, и я хотел бы получить уровни списка как факторы:

Level1 Level2 V1 V2 V3 
1  F1  A 1 1 1 
2  F1  B 2 2 2 
3  F1  C 3 3 3 
4  F2  A 1 1 1 
5  F2  B 2 2 2 
6  F2  C 3 3 3 

Первая часть хорошо определяется по формуле:

data.frame(matrix(unlist(list2), ncol=3, byrow=T)) 

Тем не менее, я не нашел хороший способ также получить имена на уровне списка в качестве факторов в одном и том же фрейме. Есть идеи? :)

Редактировать: Процедура должна соответствовать размерам p.

+0

'т (rbind.data.frame (песни2))' получает вас близко - вам нужно только создавать переменные из rownames – user20650

+0

Спасибо! Проблема в том, что имена списков меняются (это значения параметров в симуляции), поэтому я не могу просто использовать substr для выключения факторов. – jmb

ответ

4

melt от "reshape2" имеет метод для list с. Возможно, он может быть использован в этом случае. Что-то вроде этого:

library(reshape2) 
dcast(cbind(
    coln = sequence(rapply(list2, length)), 
    melt(list2)), L1 + L2 ~ coln, 
    value.var = "value") 
# L1 L2 1 2 3 
# 1 F1 A 1 1 1 
# 2 F1 B 2 2 2 
# 3 F1 C 3 3 3 
# 4 F2 A 1 1 1 
# 5 F2 B 2 2 2 
# 6 F2 C 3 3 3 
+1

Вот и все! Спасибо за подсказку с пакетом reshape2. – jmb

2

Вы можете unlist только один уровень, чем конвертировать rownames столбцам, и присоединиться к все в одном data.frame:

xx <- do.call(rbind,unlist(list2,recursive = FALSE)) 
cbind.data.frame(do.call(rbind,strsplit(rownames(xx),'.',fixed=TRUE)) 
       ,xx) 

     1 2 1 2 3 
F1.A F1 A 1 1 1 
F1.B F1 B 2 2 2 
F1.C F1 C 3 3 3 
F2.A F2 A 1 1 1 
F2.B F2 B 2 2 2 
F2.C F2 C 3 3 3 
+0

Спасибо! Это приятное решение, однако я искал процедуру, которая работает для размеров p (извините за то, что вы не указали на это в первую очередь) – jmb

2

с вашим собственным решением, обеспечивающим значения в столбцах X1, X2 и X3 уже , вы можете сделать следующее, чтобы получить первые две колонки Level1 и Level2 с именами ваших двух списков:

level1 <- as.factor(rep(names(list2), each = length(list1))) 
level2 <- as.factor(rep(names(list1), times = length(list2))) 
data.frame(Level1 = level1, Level2 = level2, matrix(unlist(list2), ncol=3, byrow=T)) 

, что приведет к следующим образом:

Level1 Level2 X1 X2 X3 
1  F1  A 1 1 1 
2  F1  B 2 2 2 
3  F1  C 3 3 3 
4  F2  A 1 1 1 
5  F2  B 2 2 2 
6  F2  C 3 3 3 
+0

Спасибо! Он работает очень хорошо, однако я надеялся на процедуру, которая работает до размеров p (извините за то, что вы не указали на это в первую очередь) – jmb

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