【发布时间】:2018-02-27 14:52:59
【问题描述】:
假设我有以下数据框:
Category = c("blue", "red", "red", "blue", "blue", "blue", "red", "red", "red","blue", "red", "red","blue","blue","red","blue","red")
Purchase = c(0,1,1,0,0,0,1,1,1,0,1,1,0,0,1,0,1)
Number = c(1,1,1,1,2,2,2,2,2,1,1,2,2,2,2,2,2)
Id = c("a","a","a","a","a","a","a","a","a","b","b","b","b","b","b","b","b")
Country = c("NL","BE","BE","UK","UK","NL","UK","UK","UK","BE","NL","NL","BE","UK","UK","BE","NL")
df = data.frame(Id, Number,Category, Purchase, Country)
> df
Id Number Category Purchase Country
1 a 1 blue 0 NL
2 a 1 red 1 BE
3 a 1 red 1 BE
4 a 1 blue 0 UK
5 a 2 blue 0 UK
6 a 2 blue 0 NL
7 a 2 red 1 UK
8 a 2 red 1 UK
9 a 2 red 1 UK
10 b 1 blue 0 BE
11 b 1 red 1 NL
12 b 2 red 1 NL
13 b 2 blue 0 BE
14 b 2 blue 0 UK
15 b 2 red 1 UK
16 b 2 blue 0 BE
17 b 2 red 1 NL
我想汇总红色后跟红色的行,按 ID 和数字分组,以便汇总这些行的购买。因此,我想要的输出是:
> desired
Id Number Category Purchase Country
1 a 1 blue 0 NL
2 a 1 red 2 BE
3 a 1 blue 0 UK
4 a 2 blue 0 UK
5 a 2 blue 0 NL
6 a 2 red 3 UK
7 b 1 blue 0 BE
8 b 1 red 1 NL
9 b 2 red 1 NL
10 b 2 blue 0 BE
11 b 2 blue 0 UK
12 b 2 red 1 UK
13 b 2 blue 0 BE
14 b 2 red 1 NL
因此,应保持类别出现的顺序,并且仅应聚合类别为“红色”的类别。此外,在我的真实数据框中,我有几个列,例如 Country 列,我也希望它们出现在输出中,但我不想手动定义所有这些列。我尝试过使用aggregate函数或ddply,但还是没有整理出来。
有人可以帮我解决这个考虑行顺序的聚合问题吗?
【问题讨论】:
-
@jogo 已删除答案的变体:
library(data.table); setDT(df)[, .(Purchase = if (Category=="red") sum(Purchase) else Purchase), by=.(Id, Number, Category, rleid(Id, Number, Category))]