我的数据框看起来像这样:
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和转换。但是,我正在努力寻找一种自动分配类型的方法,因为每个组都包含不同类型和不同类型的数量。
您对我如何管理有任何建议吗?
答案 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
修改小改进。