2013-09-03 22 views
8

Şimdiden özür dilerim - bunun muhtemelen başka bir yerde cevaplandığını biliyorum, ancak ihtiyacım olan cevabı bulamıyorum ve adapte edemiyorum ihtiyaçlarımda bulduğum diğer kod.Eşleşen sütuna göre sütun çiftlerini çıkar

bir veri çerçevesi vardır:

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

Her dosya için bir sıra ile, bir ile iki arasında COUNT değerlerinin farkı bir veri çerçevesi üretmek istiyoruz, yani

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

Temel olarak R veya Plyr ile bunu kolayca yapabilmem gerektiğine inanıyorum, ama biraz takılıyorum. Bunu yapmak için iyi bir yol önerebilir ve belki de gelecekteki benzer sorunlarda bana yardımcı olabilecek belki de iyi bir eğitici olabilir mi? tabanında aggregate kullanma

Teşekkür

cevap

10

:

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

plyr içinde ddply kullanma

> 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 

wi ile Doby paketinden summaryBy ile tapply

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

ile by

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

inci

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

Güncelleme yüzdesi, :

> 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. Şimdi, en azından :) – A5C1D2H2I1M1N2O1R2T1

+0

eklemek için "data.table" ve "by" eklemeniz gerekir. Öncelikle, fantastik cevaplar ve çeşitlilik için teşekkürler - bir rulo üzerinde ciddi (ve cevapınızı bir an). Son bir ekleme - bunu orijinalin yüzdesi olarak nasıl hesaplayabilirim? (ör. A,% 40 olur). Anladım ki, bu fark dıĢından başka bir Ģey kullanmamı gerektirir, değil mi? – obfuscation

+0

nerede% 40 geliyor? –

İlgili konular