R用非对称函数重塑铸件
如何使用带有非对称函数的R用非对称函数重塑铸件,r,reshape,asymmetric,R,Reshape,Asymmetric,如何使用带有非对称函数的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 对于a的每个x级别,我想得到差异 t[t$a==x & t$b==2, 'c'] - t[t$a==x & t$b==1, 'c'] 如果我想要一个和,那很简单:cast(t,a~,fun.agg
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
对于a
的每个x
级别,我想得到差异
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==2
值中减去b==1
值,反之亦然
谢谢 这里有一个稍微复杂的示例,同一(a,b)对有多行: 您可以仅对每个子集执行分组:
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
下面是一个稍微复杂一些的示例,同一(a,b)对有多行: 您可以仅对每个子集执行分组:
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
下面是一个稍微复杂一些的示例,同一(a,b)对有多行: 您可以仅对每个子集执行分组:
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
下面是一个稍微复杂一些的示例,同一(a,b)对有多行: 您可以仅对每个子集执行分组:
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
您可以使用
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
库(重塑)
t2您可以使用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
库(重塑)
t2您可以使用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
库(重塑)
t2您可以使用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
库(重塑)
t2当总是在b==2
之前给出b==1
时,这在这里起作用。但是,如果顺序与实际数据的关系更为松散,它只会从第一行减去第二行,而不一定从b==2
减去b==1
。我想如果存在一个a
值,而该值没有恰好一行b=1
行和正好一行b=2
行,那么这将不起作用,但肯定是最干净的方法!当b==1
总是在b==2
之前给出时,这种方法在这里有效。但是,如果顺序与实际数据的关系更为松散,它只会从第一行减去第二行,而不一定从b==2
减去b==1
。我想如果存在一个a
值,而该值没有恰好一行b=1
行和正好一行b=2
行,那么这将不起作用,但肯定是最干净的方法!当b==1
总是在b==2
之前给出时,这种方法在这里有效。但是,如果顺序与实际数据的关系更为松散,它只会从第一行减去第二行,而不一定从b==2
减去b==1
。我想如果存在一个a
值,而该值没有恰好一行b=1
行和正好一行b=2
行,那么这将不起作用,但肯定是最干净的方法!当b==1
总是在b==2
之前给出时,这种方法在这里有效。但是,如果顺序与实际数据的关系更为松散,它只会从第一行减去第二行,而不一定从b==2
减去b==1
。我想如果存在一个a
值,而该值没有恰好一行b=1
行和正好一行b=2
行,那么这将不起作用,但肯定是最干净的方法!我还考虑过将两个b
因子分成不同的列,然后进行减法——只是想知道是否有一个一步解决方案。我想不会吧。我还想把两个b
因子分成不同的列,然后进行减法——只是想知道是否有一个一步解决方案。我想不会吧。我还想把两个b
因子分成不同的列,然后进行减法——只是想知道是否有一个一步解决方案。我想不会吧。我还想把两个b
因子分成不同的列,然后进行减法——只是想知道是否有一个一步解决方案。我想不会吧。