2011-10-28 5 views
1

크기가 103740 x 4 인 데이터 프레임을 와이드 포맷, 즉 아래 첫 번째 텍스트 블록에서 두 번째 텍스트 프레임으로 이동하는 데 바꾼다. 데이터 프레임의 일부에 적용 할 때 다음 함수는 충분히 잘 작동하지만 전체 데이터 프레임에 적용 할 때 내 컴퓨터의 사용 가능한 메모리를 소모 :R에서 대용량 데이터 프레임을 제거하는 더 좋은 방법은 무엇입니까?

reshape(analysis1[1:8], idvar=c("name", "sire_name"), 
     timevar = "course", direction = "wide")[, -c(1,2)] 

이 데이터 프레임을 언 스택 몇 가지 더 나은 방법은 무엇입니까?

  name sire_name  course appearance 
1  A Beetoo Bahhare  Kempton   0 
2  A Beetoo Bahhare  Lingfield   9 
3  A Beetoo Bahhare  Southwell   0 
4  A Beetoo Bahhare Wolverhampton   0 
5 A Bid In Time Danetime  Kempton   0 
6 A Bid In Time Danetime  Lingfield   3 
7 A Bid In Time Danetime  Southwell   2 
8 A Bid In Time Danetime Wolverhampton   2 
... 

    Kempton Lingfield Southwell Wolverhampton 
1  0   9   0    0 
5  0   3   2    2 
... 

데이터 테이블로 데이터 프레임을 이동 시키려고했지만이 작업만으로는 도움이되지 않습니다.

답변

1

베이스 R로 재구성하는 것이 매우 효율적일 때 가장 효율적입니다. 행렬을 만들어 데이터 형식 프레임으로 캐스팅하고 열의 이름을 지정하면됩니다. 이제

newDF <- data.frame(matrix(oldDF$appearance, ncol = 4, byrow = TRUE)) 
names(newDF) <- oldDF$course[1:4] 

, 당신은 다음과 같은 더 강력 과정 열에서 더 많은 값을을 발표 어쩌면이 한 것처럼 정렬 프레임이없는 경우 ...

oldDF <- oldDF[ order(oldDF$course), ] 
s <- sort(unique(oldDF$course)) 
newDF <- data.frame(matrix(oldDF$appearance, ncol = length(s))) 
names(newDF) <- s 

(주문 함수에 다른 열을 추가하여 원하는 경우 연결을 끊을 수 있음)

데이터를 재구성하는 데 사용할 수있는 많은 명령의 큰 장점 중 하나는 데이터의 순서에 강건하다는 것입니다 , 누락 된 세포 등. 그러나 이것은 또한 일반적으로 꽤 느린 yo 때 아주 큰 data.frame 객체에서 직선적 인 모양을 만들었습니다.

+0

아마도 데이터 프레임이 적절하게 정렬되었다고 가정해야합니다. – joran

+0

예, 첫 번째 버전에서는 표시된대로 데이터 프레임이 정렬되어 있다고 가정합니다. 그렇지 않다면 두 번째 버전을 사용하십시오. – John

+1

이것은 기본적으로'reshape :: melt'이하는 것입니다. 훨씬 느린 경우 놀랄 것입니다. 그리고 속도가 느린 경우, 값이 누락 된 것에 대해 걱정할 필요가 없으므로 아마도 오랫동안 잘못된 시간에 시간을 절약 할 수 있다고 주장 할 것입니다. – hadley

관련 문제