2009-10-30 6 views
18

다음과 같은 목록 목록이 있습니다 : x[[state]][[year]]. 이것의 각 요소는 데이터 프레임이므로 개별적으로 액세스하는 것은 문제가되지 않습니다.목록 목록에서 rbind 데이터 프레임

그러나 여러 목록에 걸쳐 데이터 프레임을 역 바인드하고 싶습니다. 좀 더 구체적으로 말하면, 저는 매년 많은 데이터 프레임을 출력하고 싶습니다. 즉, 매년 모든 국가 데이터 프레임을 찾아야합니다. 다시 말해, 모든 주 데이터를 매년 결합하여 별도의 데이터 프레임으로 만들고 싶습니다.

단일 목록을 do.call("rbind",list)이라는 데이터 프레임에 결합 할 수 있다는 것을 알고 있습니다. 그러나 목록 목록 전체에서 어떻게 그렇게 할 수 있는지 알지 못합니다.

extract.year <- function(my.year) lapply(x, function(y) y[[my.year]]) 

x.by.year <- sapply(my.list.of.years, function(my.year) 
    do.call(rbind, extract.year(my.year))) 

함수 추출 올해는 특정 연도에 딱 dataframes가 포함되어있는리스트를 작성합니다

+2

, 왜 데이터를이 방법을 다루고보다는 모든 데이터를 하나 개의 큰 데이터 프레임을 가지고? –

답변

6

는 다음과 같은 라인을 따라 뭔가를 (내가 그런 구조가 없기 때문에 제가 테스트 할 수있다) 할 수 있습니다. 그럼 당신은 그들을 rbind ... 첫 번째 목록에

+2

위의 대답으로 상황이 복잡해지면서 접근 방식을 시도했습니다. 약간 수정. 첫 번째 라인은 내가 찾고있는 데이터 프레임을 반환했습니다. 두 번째 라인은 작동하지 않으므로 대신 Hadley의 plyr 패키지를 사용했습니다. 이 명령은 첫 번째 줄 다음에 rbinded 데이터 프레임의 목록을 완벽하게 반환합니다. llply (my.list.of.years, function (my.year) do.call (rbind, extract.year (my.year))) 신난다, 도와 줘서 고마워! – bshor

+1

ldply()는 더욱 빠르고 효율적입니다! – bshor

32

축소를 : 호기심에서

list <- unlist(listoflists, recursive = FALSE) 
df <- do.call("rbind", list) 
+0

신속한 도움에 감사드립니다! 그러나 이것은 내가 원하는 것만은 아닙니다. 당신의 대답은 목록 목록에있는 모든 데이터 프레임에 대해 단일 데이터 프레임을 제공합니다 (unlist를 사용하면 내가 알지 못했던 멋진 명령). 그러나 나는 32 년 동안의 모든 데이터 프레임을 목록으로 만들고 싶다. 대답의 첫 번째 줄은 대략 국가 * 연도 길이 목록을 얻습니다. (어떤 이유로 저는 예상했던대로 32 * 50 = 1600이 아닌 길이 = 1584가됩니다). 그래서 나는 그것이 단서라고 생각합니다 ... – bshor

+0

좀 더 실험을 한 후, 나는 어딘가에 있다고 생각합니다. 나는 처음으로 상태 목록의 요소를 명명 했으므로 이제 목록에없는 목록 (Hadley의 첫 번째 명령 이후)에 "AL3"및 "TX4"와 같은 유용한 이름이 추가되었습니다. 이제 모든 3을 함께 결합해야합니다. 4 가지를 모두 조합해야합니다. – bshor

+0

오, 이런, 정규 표현식이 그 대답의 일부라고 생각합니다. 나는 "1"이라는 이름의리스트를 얻기 위해 grep ("1 $", names (list))을 시도했지만, 11, 21, 31처럼 1 년 동안 나에게 1 년을 보낸다. grep "\ D1 $", 이름 (목록))하지만 아무 것도 없습니다. – bshor