0

如何使用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

对于每个级别xa我都想有所作为

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价值,反之亦然。

谢谢!

4

2 回答 2

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
于 2014-03-10T19:48:30.180 回答
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
于 2014-03-10T19:47:26.190 回答