将data.table中的分组总和除以一步获得率

时间:2017-02-15 22:37:20

标签: r data.table

我有一个看起来像这样的data.table:

Fruit       Date    Count
Apple       8/29/16 20548
Orange      8/29/16 14744
Banana      8/29/16 10605
Strawberry  8/29/16 8341
Watermelon  8/29/16 7768
Apple       8/30/16 9819
Orange      8/30/16 5858
Banana      8/30/16 3624
Strawberry  8/30/16 2595
Watermelon  8/30/16 2291
Apple       8/31/16 6662
Orange      8/31/16 6563
Banana      8/31/16 2073
Strawberry  8/31/16 1827
Watermelon  8/31/16 1738

如何通过Count&获得Fruit的总和Date,然后将总和除以一步产生一个比率(例如Banana / Apple)?获得总和很容易(注意:我也过滤Fruit一次只能抓两个):

d.table[Fruit %in% c('Apple', 'Banana'), .(Sum = sum(Count)), .(Fruit, Date)]

但是我只是一步到达了我想要的输出:

Date    Rate
8/29/16 0.52
8/30/16 0.37
8/31/16 0.31

我应该注意到我的实际data.table有额外的列(仅用于过滤)并且我不想重塑我的数据/如果可能的话使用另一个包,因为此操作的结果将在之后绘制过滤多个/不断变化的标准,所以我希望能够轻松地重复使用(即单行)。

提前致谢。

2 个答案:

答案 0 :(得分:4)

这应该有效:

d.table[Fruit %in% c('Apple', 'Banana'),
        .(Rate = sum(Count[Fruit == 'Banana']) / sum(Count[Fruit == 'Apple'])),
       .(Date)]
#       Date      Rate
# 1: 8/29/16 0.5161086
# 2: 8/30/16 0.3690804
# 3: 8/31/16 0.3111678

答案 1 :(得分:2)

以下是dcast

的另一个选项
library(data.table)
dcast(setDT(d.table)[Fruit %chin% c("Banana", "Apple")],
      Date~Fruit, value.var="Count")[, .(Date, Rate = Banana/Apple)]
#      Date      Rate
#1: 8/29/16 0.5161086
#2: 8/30/16 0.3690804
#3: 8/31/16 0.3111678