2012-06-13 2 views
9

다음과 같은 데이터 프레임이 있습니다 (20,000 행 x 49 열). 각 행에는 고유 한 이름 (ID)이 있으며 각 ID에는 3 개의 열에 3 개의 반복 읽기가 있습니다 (예 : D15C D15C.1 D15C.2). colnames ("D15C")의 처음 네 글자는 그룹 이름입니다. 그룹 이름별로 열을 평균화해야합니다 (예 : 평균 D15C, D15C.1 및 D15.2에서 D15C 가져 오기). 따라서 최종 테이블은 49 열에서 16 열로 통합됩니다.R 행은 그룹 (또는 고유 ID)별로 여러 열을 의미합니다.

  ID D04C D04C.1 D08H D08H.1 D08H.2 D15C D15C.1 D15C.2 D15L D15L.1 D15L.2 
1 1367452_at 11.11 10.93 11.85 10.94 10.87 10.73 10.62 10.85 10.73 10.77 10.52 
2 1367453_at 9.65 9.94 9.78 9.68 9.67 9.86 9.71 9.82 9.74 9.71 9.76 
3 1367454_at 10.19 10.36 9.68 10.07 10.08 10.35 10.26 10.32 10.27 10.19 10.47 
(… 20000 rows)            

내가 전치 및 골재 사용하기 위해서는 다음과 같은 데이터 프레임에 편집 :

 ID 1367452_at 1367453_at 1367454_at ... ... 
1 D04C  11.11  9.65  10.19 
2 D04C  10.93  9.94  10.36 
3 D08H  11.85  9.78  9.68 
4 D08H  10.94  9.68  10.07 
5 D08H  10.87  9.67  10.08 
6 D15C  10.73  9.86  10.35 
7 D15C  10.62  9.71  10.26 
8 D15C  10.85  9.82  10.32 
9 D15L  10.73  9.74  10.27 
10 D15L  10.77  9.71  10.19 
11 D15L  10.52  9.76  10.47 

그러나, 다음과 같은 집계 ("AGG는"데이터 프레임 이름) 완료 370 초 걸렸습니다 . 문제는

agg <- aggregate(x = agg[, 2:ncol(agg)], by = list(ID = agg$ID), FUN = "mean", na.rm = T) 

그래서 나는 data.table로 변환 데이터 테이블 방법을 실행 ...... 내가 기다리고 테이블 이런 종류의 100 년대를 가지고있다. 무엇이 잘못되었는지 확실하지

Error: cannot allocate vector of size 144 Kb 
In addition: Warning messages: 
1: Reached total allocation of 1535Mb: see help(memory.size) 
2: Reached total allocation of 1535Mb: see help(memory.size) 

:

dt <- as.data.table(agg) 
setkey(dt, ID) 
dt2 <- dt[,lapply(list(dt[2:ncol(dt)]),mean),by = ID] 

하지만

몇 분 후 오류 메시지를 받았습니다. dt의 "head"부분을보기 위해 dt [1 : 5,1 : 5]를 사용할 수없고, head (dt)는 지붕을 통해 지나치는 많은 줄을 반환합니다. "head"도 볼 수 없습니다. 지금 무엇을 해야할지 모르겠다.

ID를 하나의 열 (data.frame)로 나열하거나 테이블을 조 변경하고 ID를 첫 번째 행에 나열 할 수 있습니다 (data.table처럼). 어느 쪽이든, 데이터를 집계하는 더 빠른 방법이 있습니까? 대단히 감사합니다!

+0

첫 번째 질문은 무엇입니까? 환영. 'data.table' 패키지처럼 data.table을 정말로 의미합니까? 'transpose'와'aggregate'를 시도했다면 사람들이 도울 수 있도록 시도한 정확한 명령을 제공하는 것이 가장 좋습니다. 'Data.table 메소드'가 무슨 의미인지 모르겠다. 아마도 Stack Overflow에 대한 좋은 질문을하기위한 가이드 라인이있을 것입니다. R 채팅방에서 조언을 구하십시오. –

+0

죄송합니다. 명확하지 않았습니다. 더 자세한 내용을 제공하도록 편집했습니다. 희망은 지금 더 이해할 수 있습니다. – user1444754

+0

훨씬 더 좋습니다. 감사합니다. 이것은 매우 빨리 대답하게 만들었습니다. –

답변

12

이 :

dt2 <- dt[,lapply(list(dt[2:ncol(dt)]),mean),by = ID] 

그냥해야한다 :

dt2 <- dt[, lapply(.SD,mean), by=ID] 

dt[2:ncol(dt)]

은 행의 하위 집합을 복용 사실이었다.

data.table 구문을 익히는 한 가지 방법은 프롬프트에서 example(data.table)을 실행하고 프롬프트에서 예제를 수행하는 것입니다. "# 그룹별로 열 적용"을 검색하면이 예제를 정확하게 찾을 수 있습니다.

는 그리고 .SD을 배우고, 가장 좋은 방법은 문자열 ".SD"에 대한 ?data.table를 검색하는 것입니다 다음도 검색에 의해 반환되는이 data.table 태그 .SD에 대한 몇 가지 좋은 질문과 매우 상세한 답변 [ "data.table있다 ] .SD ".

+0

Matthew에게 감사드립니다. 코드가 아름답게 작동했습니다. 방금 .SD를 조사하고 오늘 아침에 예제를 실행하기 시작했습니다. 그런데 첫 번째 행 (즉, 전치 테이블)에서 그룹 (즉 ID)으로 데이터를 처리 할 수있는 방법이 있습니까?내가 물어 보는 이유는 R이 더 나은 [30,000, 3,000]이 아니라 더 넓은 [3,000, 30,000] 테이블을 더 잘 처리하는 것 같다. 예를 들어, 길다는 write.table에는 1 초가 걸리고, 동일한 크기의 전치 된 와이드 테이블을 저장하려면 5 분이 걸립니다. 그래서 나는 저장하기 전에 항상 테이블을 조 변경해야하고 테이블을 조작하기 전에 테이블을 조 변경해야합니다. 이게 "내"유일한 문제 야? – user1444754

+1

@ user1444754 이제 다행입니다. 내 대답에 투표하는 것을 잊지 마시고 동의하십시오. 그래서 다른 사람들은 그것이 해결되었다는 것을 알고 있습니다. 이 의견에 새로운 질문에 적절한 것으로 들립니다. 응답자가 신선한 R 세션에 붙여 넣어 신속하게 의미를 파악할 수있는 재현 할 수있는 예제를 제공하는 것이 가장 좋습니다. –