基于两个因素的减法

时间:2014-02-19 15:58:25

标签: r

我的数据框看起来像这样:

group <- c("A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C", "C", "C")
value <- c(3:6, 1:4, 4:9)
type <- c("d", "d", "e", "e", "g", "g", "e", "e", "d", "d", "e", "e", "f", "f")
df <- cbind.data.frame(group, value, type)

df
   group value type
1      A     3    d
2      A     4    d
3      A     5    e
4      A     6    e
5      B     1    g
6      B     2    g
7      B     3    e
8      B     4    e
9      C     4    d
10     C     5    d
11     C     6    e
12     C     7    e
13     C     8    f
14     C     9    f

在每个级别的因子“组”中,我想基于“类型”减去这些值,使得(对于组“A”)3 - 5(d的第一个值 - e的第一个值)和4 - 6(d的第二值 - d的第二值)。我的结果应该与此类似..

A
  group d_e
1     A  -2
2     A  -2

B
  group g_e
1     B  -2
2     B  -2

C
  group d_e d_f e_f
1     C  -2  -4  -2
2     C  -2  -4  -2

因此,如果 - 对于C组 - 有两种以上的类型,我想计算每种类型组合之间的差异。

阅读this post我估计我可以使用ddply和转换。但是,我正在努力寻找一种自动分配类型的方法,因为每个组都包含不同类型和不同类型的数量。

您对我如何管理有任何建议吗?

1 个答案:

答案 0 :(得分:4)

不清楚为什么帖子中的样本答案在每个输出组中有两个相同的行,而不仅仅是一个,但无论如何这会产生与所示相似的输出:

DF <- df[!duplicated(df[-2]), ]
f <- function(x) setNames(
            data.frame(group = x$group[1:2], as.list(- combn(x$value, 2, diff))),
                   c("group", combn(x$type, 2, paste, collapse = "_"))
            )

by(DF, DF$group, f)

,并提供:

DF$group: A
  group d_e
1     A  -2
2     A  -2
------------------------------------------------------------ 
DF$group: B
  group d_e
1     B  -2
2     B  -2
------------------------------------------------------------ 
DF$group: C
  group d_e d_f e_f
1     C  -2  -4  -2
2     C  -2  -4  -2

修改小改进。