根据匹配列减去列对

时间:2013-09-03 13:22:29

标签: r plyr

我会提前道歉 - 我知道这可能已在其他地方得到解答,但我似乎无法找到我需要的答案,也无法适应我发现的其他代码以满足我的需求

我有一个数据框:

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

我想生成一个数据框,其中包含ONE和TWO之间COUNT值的差异,每个文件都有一行,即

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

我确信我应该能够使用基础R或Plyr轻松地做到这一点,但我有点卡住了。任何人都可以建议一个很好的方法来做这个,也许有关Plyr的好教程可能会帮助我解决类似的问题吗?

由于

1 个答案:

答案 0 :(得分:10)

在base中使用aggregate

> 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

by

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

tapply

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

来自doBy包的summaryBy

> # 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