2013-09-03 5 views
8

미리 사과드립니다. 다른 곳에서 답을 얻은 것으로 알고 있지만 필요한 답을 찾을 수없는 것 같고 적응할 수 없습니다. 내가 필요로하는 다른 코드.일치하는 열을 기준으로 열 쌍을 뺍니다.

난 데이터 프레임 가지고

FILE | TECHNIQUE | COUNT 
------------------------ 
A | ONE  | 10 
A | TWO  | 25 
B | ONE  | 5 
B | TWO  | 30 
C | ONE  | 30 
C | TWO  | 50 

는 I 각 파일에 대한 행과, 하나, 둘 사이의 카운트 값의 차분의 데이터 프레임을 생성하고자, 즉

FILE | DIFFERENCE 
----------------- 
A | 15 
B | 25 
C | 20 

베이스 R 또는 플라이어를 사용하여이 작업을 상당히 쉽게 수행 할 수있을 것으로 확신하지만 약간의 문제가 있습니다. 누구나이 일을 할 수있는 좋은 방법을 제안 할 수 있습니까? 그리고 Plyr에 대한 좋은 자습서가 앞으로 비슷한 문제를 일으킬 수 있습니다. 베이스 aggregate를 사용

감사

답변

10

:

> aggregate(.~FILE, data= DF[, -2], FUN=diff) 
    FILE COUNT 
1 A 15 
2 B 25 
3 C 20 

plyr에 ddply를 사용

> ddply(DF[,-2], .(FILE), summarize, DIFFERENCE=diff(COUNT)) 
    FILE DIFFERENCE 
1 A   15 
2 B   25 
3 C   20 

data.table

> # library(data.table) 
> DT <- data.table(DF) 
> DT[, diff(COUNT), by=FILE] 
    FILE V1 
1: A 15 
2: B 25 
3: C 20 

위스콘신과 doBy 패키지에서 summaryBytapply

> tapply(DF$COUNT, DF$FILE, diff) 
A B C 
15 25 20 

by

> with(DF, by(COUNT, FILE, diff)) 
FILE: A 
[1] 15 
----------------------------------------------------------------------------- 
FILE: B 
[1] 25 
----------------------------------------------------------------------------- 
FILE: C 
[1] 20 

> # library(doBy) 
> summaryBy(COUNT~FILE, FUN=diff, data=DF) 
    FILE COUNT.diff 
1 A   15 
2 B   25 
3 C   20 

업데이트 비율로 :

> aggregate(.~FILE, data= DF[, -2], function(x) (x[1]/x[2])*100) 
    FILE COUNT 
1 A 40.00000 
2 B 16.66667 
3 C 60.00000 
+0

+1. 이제는'data.table'과'by'을 추가해야합니다 :) – A5C1D2H2I1M1N2O1R2T1

+0

첫째로, 환상적인 답변과 다양한 감사의 덕분입니다. - 진지하게 롤에 올라 있습니다. 순간). 마지막으로 한 가지 추가 사항 - 원본의 비율로 어떻게 계산할 수 있습니까? (예 : A는 40 %가됩니다). 나는 이것이 diff가 아닌 다른 것을 사용하는 것을 이해할 것입니다, 그렇죠? – obfuscation

+0

40 %는 어디에서 유래됩니까? –

관련 문제