2013-06-17 3 views
2

나는 여러 개의 data.frames 목록을 가지고 있습니다. 각 data.frame에는 여러 개의 열이 있습니다. 사용하여 mean(mylist$first_dataframe$a 이 하나의 data.frame에 대한 평균을 얻을 수 있습니다. 그러나 내 목록에 저장된 모든 data.frames 또는 특정 data.frames에 대한 계산 방법을 모르겠습니다.예 : 다중 열 데이터 목록의 평균. 프레임

나는 루프를 사용할 수 있지만 apply()과 그 변화가 내가 검색을 통해 발견 몇 가지 솔루션을 사용하여 시도하지만 어떻게 든 그냥 작동하지 않습니다 더 나은 것을 들었다. 은 내가

unlist() 

당신이 예를 들어, 계산하는 방법의 예를 제공 할 수 사용해야 가정 내 같은 데이터 구조의 의미. 여러 개의 열을 포함하는 여러 data.frames가있는 목록입니다.

업데이트 : 혼란스럽게 생각합니다. 모든 데이터 프레임에서 특정 열에 대한 의미를 원했습니다. Thomas는 모든 데이터 프레임의 특정 열에 대한 평균값을 계산하기위한 작업 솔루션을 제공하고 모든 데이터 프레임의 모든 열에 대한 평균을 계산하는 데 유용한 솔루션을 제공하는 psychometriko에게 감사합니다 (숫자 데이터가 관련되지 않은 경우에도 &).).

감사합니다.

+0

목록의 구성 요소를 구성하는 데이터 프레임의 구조가 같습니다 (즉, 각 열의 이름과 클래스가 같은 행 수와 다를 수 있음)? – psychometriko

+0

@psychometriko 그들은 정확히 같은 구조를 가지고 있습니다 – Nikita

+0

@ 토마스 마지막 하나. 그래서 나는 목록을 가지고있다. 이 목록에는 동일한 구조의 많은 데이터 프레임이 포함되어 있습니다. dataframe1에서 dataframe5까지 있고 각각에는 "a", "b"및 "c"열이 있다고 가정 해 봅시다. 이제 모든 데이터 프레임을 결합한 "a"의 웅대 한 평균을 원합니다. – Nikita

답변

4

이게 당신이 찾고 있는게 있니?

set.seed(42) 
mylist <- list(a=data.frame(foo=rnorm(10), 
          bar=rnorm(10)), 
       b=data.frame(foo=rnorm(10), 
          bar=rnorm(10)), 
       c=data.frame(foo=rnorm(10), 
          bar=rnorm(10))) 
sapply(do.call("rbind",mylist),mean) 

     foo  bar 
0.1163340 -0.1696556 

참고 : do.call("rbind",mylist) 반환 그의 대답에 롤랜드에 의해 언급 된대로, sapply 다음 unlist 기능을 위에서 언급 한 것과 유사한 무언가가, 단지의 각 구성 요소 (열)의 기능 mean를 호출 위의 do.call 함수의 결과 인 data.frame.

편집 : 숫자가 아닌 data.frame 컴퍼넌트를 처리하는 방법에 대한 질문에 대한 응답으로, 아래의 솔루션은 틀림없는 매우 우아하고 더 나은 사람이 존재 확신하지만, 여기에 첫 번째 일이 I

set.seed(42) 
mylist <- list(a=data.frame(rand=rnorm(10), 
          lets=sample(LETTERS,10,replace=TRUE)), 
       b=data.frame(rand=rnorm(10), 
          lets=sample(LETTERS,10,replace=TRUE)), 
       c=data.frame(rand=rnorm(10), 
          lets=sample(LETTERS,10,replace=TRUE))) 
sapply(do.call("rbind",mylist),function(x) { 
    if (is.numeric(x)) mean(x) 
}) 

$rand 
[1] -0.02470602 

$lets 
NULL 

이 기본적으로 그냥 경우, 평균을 반환, 각 구성 요소가 숫자 첫번째 테스트 여부를 사용자 정의 함수를 만든 : 생각 할 수 있었다. 그렇지 않으면 건너 뜁니다.

+0

예! 고맙습니다. 그것은 내가 필요로하고 당신의 모범이되는 것입니다. 그러나 "foo"또는 "bar"만 계산하는 방법. 이 코드를 전체 목록에 사용하면 많은 경고 (숫자가 아님)와 이상한 결과가 나타납니다. – Nikita

+0

위의 편집을 참조하십시오. – psychometriko

+0

이 방법도 효과적이지만 모든 데이터 프레임에서 웅대 한 의미는 아닙니다. "foo"/ "a"에 대한 각 데이터 프레임과 그 평균을 나열합니다. – Nikita

2

전체가 do.call('rbind', List) 일은 상당히 느려서 사고가 날 수 있습니다. 당신이 평균을 필요로 하나의 열이있는 경우, 가장 좋은 방법은 다음과 같습니다

mean(sapply(mylist, function(X) X$rand)) 

그것은 약 10 배 빨라진하여 do.call 방법입니다.

+0

열 이름이 사용자로부터 가져올 인수 일 경우 어떻게해야합니까? – Tanny