我会提前道歉 - 我知道这可能已在其他地方得到解答,但我似乎无法找到我需要的答案,也无法适应我发现的其他代码以满足我的需求
我有一个数据框:
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的好教程可能会帮助我解决类似的问题吗?
由于
答案 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