2016-07-27 5 views
3

У меня есть объект data.frame во вложенном списке, я хочу сгруппировать их по имени объекта data.frame. Поскольку каждый вложенный список, объекты data.frame размещаются в другом порядке, мне сложно сгруппировать их в новый список. Я попробовал метод транспонирования из пакетов purr в CRAN, но это был неправильный ответ, который я ожидал. Кто-нибудь знает какой-либо трюк для такого рода группировки для объекта data.frame более эффективно? Большое спасибоКак сгруппировать набор объектов data.frame во вложенном списке с другим порядком?

пример:

res_1 <- list(con=list(a.con_1=airquality[1:4,], b.con_1=iris[2:5,], c.con_1=ChickWeight[3:7,]), 
       dis=list(a.dis_1=airquality[5:7,], b.dis_1=iris[8:11,], c.dis_1=ChickWeight[12:17,])) 

res_2 <- list(con=list(b.con_2=iris[7:11,], a.con_2=airquality[4:9,], c.con_2=ChickWeight[2:8,]), 
       dis=list(b.dis_2=iris[2:5,], a.dis_2=airquality[1:3,], c.dis_2=ChickWeight[12:15,])) 

res_3 <- list(con=list(c.con_3=ChickWeight[10:15,], a.con_3=airquality[2:9,], b.con_3=iris[12:19,]), 
       dis=list(c.dis_3=ChickWeight[2:7,], a.dis_3=airquality[13:16,], b.dis_3=iris[2:7,])) 

желаемого результат:

group1_New <- list(con=list(a.con_1, a.con_2, a.con_3), 
        dis=list(a.dis_1, a.dis_2, a.dis_3)) 

group2_New <- list(con=list(b.con_1, b.con_2, b.con_3), 
        dis=list(b.dis_1, b.dis_2, b.dis_3)) 

group3_New <- list(con=list(c.con_1, c.con_2, c.con_3), 
        dis=list(c.dis_1, c.dis_2, c.dis_3)) 
+1

Это поможет вам, если вы включите [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). Вы должны определить все переменные, включенные в ваш код, чтобы их можно было скопировать/вставить в R для запуска и тестирования. – MrFlick

+0

Я не вижу никаких проблем, я только что протестировал в R. – Jeff

+0

Да, это правильно, в каждом списке a, b, c находятся в другом порядке точно – Jeff

ответ

3

Вот дважды вложенный цикл, который создает нужную структуру. Вероятно, существует более эффективный метод.

# put the nested lists into a list: 
myList <- list(res_1, res_2, res_3) 
# make a copy of the list to preserve the structure for the new list 
myList2 <- myList 

for(i in seq_len(length(myList))) { 
    # get ordering of inner list names 
    myOrder <- rank(names(myList[[c(i,2)]])) 

    for(j in seq_len(length(myList[[i]]))) { 
    for(k in seq_len(length(myList[[c(i, j)]]))) { 
     # reorder content 
     myList2[[c(myOrder[k], j, i)]] <- myList[[c(i, j, k)]] 
     # rename element 
     names(myList2[[c(myOrder[k], j)]])[i] <- names(myList[[c(i, j)]])[k] 
    } 
    } 
} 

При желании вы можете извлечь элементы списка после циклов.

Ключом к этому решению является осознание того, что если вы поместите эти списки в список, результат может быть достигнут путем выборочного изменения индексов элементов списка. По выборочно я имею в виду, что я включаю rank в именах data.frame, чтобы найти правильный порядок для самого внутреннего цикла.

В дополнение к переупорядочиванию кадров данных по желанию я включил строку для правильной перезагрузки имен в списке.

+0

Это моя идея: что, если я отменил порядок res_2, res_3, то пусть они имеют одинаковый порядок элементов, например res_1, а затем используют пакеты purrr для транспонирования соответственно. Это возможно? Если да, как я могу сделать обратный порядок? – Jeff

+0

Ваше решение не дало мне моего желаемого результата. Есть идеи? – Jeff

+1

См. Мою отредактированную версию, которая как переупорядочивает data.frames, так и имена списков. – lmo