2013-07-01 6 views
0

I는 I는 행렬 M이 처음 두 columns.For 예에서의 값에 따라 데이터 프레임의 열 (들)을 요약하는 함수를 작성하는 것을 시도하고,합계 여러 열

Crs gr P_7 P_8  
38 1 3 16 
38 1 12 45 
38 1 9 28 
40 2 3 9 
40 2 14 29 
40 1 4 3 
40 2 8 2 

column1 (crs), column2 (gr)에 따라 열을 합산하려고합니다. 결과

Crs gr P_7 P_8  
    38 1 24 89 
    40 2 25 40 
    40 1 4 3 

은 현재 내가 사용

M <- M[, list(sum(P_7),sum(P_8)), by=list(Crs,gr)] 

그러나이 문제는, 내가 늘 고정 컬럼의 이름을 정의해야한다는 것입니다하고, 될 것입니다. 그래서, 어떻게 열의 이름을 정의하지 않고 이것을 할 수 있는지 궁금합니다. 미리 감사드립니다.

+1

아무 문제,하지만 당신 ' 'data.table' 질문을했고,'plyr'를 사용하는 것보다 훨씬 더 효율적인 방법이 있습니다 (@ eddi를보십시오). – Arun

+0

@Arun 계산 속도가 빠릅니다. 그렇습니다. 그러나 효율성은 프레임 워크를 얼마나 편하게 사용하는지에 따라 달라집니다. 나는'data.table'을 광범위하게 사용 했음에도 불구하고'plyr' 솔루션을 작성하는 것이 훨씬 더 효율적이라는 것을 알았습니다. – Andrie

+0

@Andrie, 내가 eddi의 대답을 강조한 유일한 이유는 OP가 이미 'data.table'시도를 보여 주었기 때문입니다. 그러나, 나는 plyr의 팬이고 그것에 대해 또는 당신의 대답에 대해 아무것도 없습니다. 거대한 데이터 (생물 정보 과학자로서)가 작동하지 않는 한, plyr의 간결함을 손상시킬 필요가 없습니다 (비록 내가 data.table 구문을 매우 직접적으로, 개인적으로 찾을 수는 있지만) . – Arun

답변

5

당신이 찾고하지있어이 ​​같은 ddplynumcolwise의 조합을 사용 Andrie의 대답에

M[, lapply(.SD, sum), by = list(Crs, gr)] 
5

패키지 plyr에는 이와 같은 상황에 대한 마법이 있습니다.

library(plyr) 
ddply(dat, .(Crs, gr), numcolwise(sum)) 

결과 :

Crs gr P_7 P_8 
1 38 1 24 89 
2 40 1 4 3 
3 40 2 25 40 
+0

Brilliant! 마술이 작동했습니다. 감사합니다. – jsin