2014-10-07 2 views
1

목록에 대한 제한된 지식으로 인해 문제가 발생합니다. 내가 병렬 구조로, 각 레벨에서 길이가 서로 다른 여러 개의 데이터 프레임을 포함하는 목록을 가지고, 그것은 다음과 같습니다R 병렬 구조 목록에서 여러 데이터 프레임 추출 R

list.fun <- function(y) { 
    x1 <- data.frame(x = rnorm(20, mean=y)) 
    x2 <- data.frame(x = rnorm(10, mean=y)) 
    return(list(x1=x1, x2=x2)) 
} 
## make list 
foo <- lapply(1:3, list.fun) 

나는이 경우 1 개에 (같은 이름을 가진 모든 데이터 프레임을 추출하고 싶습니다), 레이블을 새 요소로 지정하고이를 하나의 단일 데이터 프레임으로 결합합니다. 이 수동 접근 방식은 작동하지만보다 일반적인 것을 찾고 있습니다.

## split results into into two data frames 
b1 <- foo[[1]]$x1 
b2 <- foo[[2]]$x1 
b3 <- foo[[3]]$x1 
b1$trial <- "t1" 
b2$trial <- "t2" 
b3$trial <- "t3" 
## combine 
bar <- rbind(d1, d2, d3) 

사과를 부탁드립니다.

답변

1

당신은 [[ 연산자를 사용하여 x1라는 이름의 모든 요소를 ​​선택할 수 있습니다

lapply(foo, "[[", "x1") 

그런 다음 함께 당신의 더 일반적인 경우를 들어 do.call

do.call(rbind, lapply(foo, '[[', "x1")) 

> head(do.call(rbind, lapply(foo, '[[', "x1"))) 
      x 
1 1.3599227 
2 0.7760733 
3 0.9852219 
4 0.5447365 
5 2.1185779 
6 0.5419102 
> nrow(do.call(rbind, lapply(foo, '[[', "x1"))) 
[1] 60 

를 사용하여 바인딩 할 수 있습니다 :

res <- do.call(rbind, lapply(seq_along(foo) 
        , function(x){ 
        out <- foo[[x]][['x1']] 
        out$trial <- paste0("t", x) 
        out 
        } 
       ) 
) 


> head(res) 
      x trial 
1 1.3599227 t1 
2 0.7760733 t1 
3 0.9852219 t1 
4 0.5447365 t1 
5 2.1185779 t1 
6 0.5419102 t1