我会提前道歉-我知道其他地方可能已经回答了这个问题,但是我似乎无法找到所需的答案,也无法设法将找到的其他代码适应我的需求。

我有一个数据框:

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的好的教程,将来可能会帮助我解决类似的问题?

谢谢

最佳答案

在基础中使用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

关于r - 根据匹配列减去列对,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18593482/

10-12 19:53