如何使用具有非对称功能的cast
重塑数据?我有数据
>t
a b c
1 1 1 30
2 1 2 25
3 2 1 59
4 2 2 1
5 3 1 12
6 3 2 97
7 4 1 66
8 4 2 43
9 5 1 13
10 5 2 32
对于x
a
的每个级别,我想得到差异
t[t$a==x & t$b==2, 'c'] - t[t$a==x & t$b==1, 'c']
如果我想要一笔钱,那就很简单:cast(t, a ~ ., fun.aggregate=sum, value = 'c')
。但由于差异是不对称的,我不知道确保从b==1
值中减去b==2
值,反之亦然。
谢谢!
答案 0 :(得分:2)
您可以使用diff
功能:
library(reshape)
t2 <- t[order(t$b), ] # to make sure '1' comes before '2'
cast(t2, a ~ ., fun.aggregate = diff, value = 'c')
a (all)
1 1 -5
2 2 -58
3 3 85
4 4 -23
5 5 19
答案 1 :(得分:1)
这是一个稍微复杂的例子,同一个(a,b)配对有多行:
dat = read.table(text=" a b c
1 1 1 30
2 1 2 25
3 2 1 59
4 2 2 1
5 3 1 12
6 3 2 97
7 4 1 66
8 4 2 43
9 5 1 13
10 5 2 32
11 5 2 1", header=T)
您只需对每个子集执行分组:
dat$a <- factor(dat$a) # So the groups match
with(dat, tapply(c[b == 2], a[b == 2], sum) - tapply(c[b == 1], a[b == 1], sum))
# 1 2 3 4 5
# -5 -58 85 -23 20
使用cast
:
library(reshape)
casted <- cast(dat, a~b, fun.aggregate=sum, value="c")
data.frame(a=casted$a, diff=casted[["2"]] - casted[["1"]])
# a diff
# 1 1 -5
# 2 2 -58
# 3 3 85
# 4 4 -23
# 5 5 20