2013-09-03 19 views
8

Przepraszam z góry - Wiem, że prawdopodobnie odpowiedziano na to w innym miejscu, ale wydaje mi się, że nie jestem w stanie znaleźć odpowiedzi, której potrzebuję i nie mogę sobie pozwolić inny kod, który znalazłem w moich potrzebach.Odejmij pary kolumn na podstawie pasującej kolumny

mam ramki danych:

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

ja podobnego, aby wytworzyć ramkę danych z różnicy wartości COUNT od jednego do dwóch, z rzędu dla każdego pliku, to znaczy

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

Jestem przekonany, że powinienem być w stanie to zrobić dość łatwo z bazą R lub Plyr, ale trochę utknąłem. Czy ktokolwiek mógłby zaproponować dobry sposób na zrobienie tego i być może dobre tutoriale na temat Plyra, które mogłyby mi pomóc z podobnymi problemami w przyszłości?

Dzięki

Odpowiedz

10

Korzystanie aggregate w bazie:

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

Korzystanie ddply w plyr

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

z 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 

wi p by

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

z tapply

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

z summaryBy z pakietu doby

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

Aktualizacja jako procent:

> 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. Teraz musisz dodać, 'data.table' i' by', przynajmniej :) – A5C1D2H2I1M1N2O1R2T1

+0

Po pierwsze, dzięki za fantastyczne odpowiedzi i podziękowania za różnorodność - jesteś na serio (i przyjmuję twoją odpowiedź w za chwilę). Jeden końcowy dodatek - jak mogę obliczyć go jako procent oryginału? (na przykład A wyniesie 40%). Rozumiem, że wymagałoby to użycia czegoś innego niż diff, prawda? – obfuscation

+0

skąd pochodzi 40%? –

Powiązane problemy