2013-09-03 34 views
8

Tôi xin lỗi trước - Tôi biết điều này có thể đã được trả lời ở nơi khác, nhưng dường như tôi không thể tìm thấy câu trả lời tôi cần và không thể quản lý để thích ứng mã khác tôi đã tìm thấy nhu cầu của tôi.Trừ cặp cột dựa trên cột phù hợp

Tôi có một khung dữ liệu:

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

Tôi muốn tạo ra một khung dữ liệu sự khác biệt của COUNT giá trị từ một đến hai, với một hàng cho mỗi FILE, tức là

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

Tôi tin rằng tôi có thể làm điều này khá dễ dàng với cơ sở R hoặc Plyr, nhưng có một chút khó khăn. Bất cứ ai có thể đề nghị một cách tốt để làm điều này, và có lẽ hướng dẫn tốt trên Plyr có thể giúp tôi với những vấn đề tương tự trong tương lai?

Cảm ơn

Trả lời

10

Sử dụng aggregate trong cơ sở:

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

Sử dụng ddply trong plyr

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

với 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 thứ by

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

với tapply

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

với summaryBy từ gói doBy

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

Cập nhật Như phần trăm:

> 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. Bây giờ bạn cần thêm 'data.table' và' by', ít nhất là :) – A5C1D2H2I1M1N2O1R2T1

+0

Thứ nhất, cảm ơn những câu trả lời tuyệt vời và cảm ơn sự đa dạng - bạn đang nghiêm túc trên một cuộn (và tôi sẽ chấp nhận câu trả lời của bạn trong một chốc lát). Một bổ sung cuối cùng - làm thế nào tôi có thể tính toán nó như một tỷ lệ phần trăm của bản gốc? (ví dụ: A sẽ trở thành 40%). Tôi hiểu điều này sẽ liên quan đến việc sử dụng một cái gì đó khác hơn là khác, phải không? – obfuscation

+0

trong đó 40% đến từ đâu? –

Các vấn đề liên quan