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
因子分成不同的列,然后进行减法——只是想知道是否有一个一步解决方案。我想不会吧。