2016-07-27 1 views
3

중첩 목록에 data.frame 개체를 설정 했으므로 data.frame 개체의 이름으로 그룹화하려고합니다. 중첩 된 각 목록, data.frame 개체가 다른 순서로 배치되기 때문에 새 목록으로 그룹화하는 데 어려움이 있습니다. CRAN의 purr 패키지에서 transpose 메서드를 시도했지만 예상 한 바가 옳지 않았습니다. 누구든지 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] 
    } 
    } 
} 

원하는 경우 루프 이후에 목록 항목을 추출 할 수 있습니다.

이 솔루션의 핵심은 이러한 목록을 목록에 넣으면 목록 항목의 색인을 선택적으로 뒤집어 결과를 얻을 수 있다는 것입니다. 선택적으로, 나는 가장 안쪽 루프에 대한 적절한 순서를 찾기 위해 data.frame 이름에 rank을 포함 시킨다는 것을 의미합니다.

원하는대로 data.frames를 재정렬하는 것 외에도 목록의 이름을 올바르게 재설정하는 행을 포함 시켰습니다.

+0

이것은 내 아이디어입니다. res_2의 순서를 바꾸면, res_3, res_1과 같은 요소 순서를 가지게하고, purrr 패키지를 사용하여 그에 맞게 조 변경합니다. 그게 가능하니? 예, 주문을 취소하려면 어떻게합니까? – Jeff

+0

귀하의 솔루션이 내게 원하는 출력을주지 못했습니다. 어떤 생각? – Jeff

+1

내 편집 된 버전을 참조하십시오.이 두 버전은 모두 data.frames와 목록 이름의 순서를 바꿉니다. – lmo