计算因子水平次数的顺序

时间:2016-08-26 00:13:21

标签: r dplyr

我的交易数据集包含多个变量,包括ID号,日期和交易区域(因子):

    id<-as.integer(rep(c(1,2,3,4,5),times=20))
    date<-rep(seq(as.Date("2011-07-01"),by="day", length.out=100))
    category<-rep(as.factor(letters[seq( from = 1, to = 4 )]),times=25)

    transactions<-data.frame(id, date, category)

    head(transactions)
      id       date category
       1 2011-07-01        a
       2 2011-07-02        b
       3 2011-07-03        c
       4 2011-07-04        d
       5 2011-07-05        a
       1 2011-07-06        b

我希望在每个ID的基础上确定因子外观的顺序,而不重述已经出现的因素。

    solution <- transactions %>%
                group_by(id, date)%>%
                mutate(category_order= (solution))

所以我可以得到:

     head(transactions)
      id       date category category_order
       1 2011-07-01        a     1
       1 2011-07-06        b     2
       1 2011-07-11        c     3
       1 2011-07-16        d     4
       1 2011-07-21        a     1
       1 2011-07-26        b     2

对于每个ID,如果类别重复,则它必须具有相同的订单值。在上面的示例中,a始终为1st,b始终为2nd,等等。

我想要做的是计算每个类别是第1,第2,第3等的次数,以获得a次为1次,b为1次,a为第2次等的频率分布:

    head(transactions)
       category category_ order category_order_count
       a     1     5
       a     2     3
       a     3     5
       a     4     4
       b     1     5
       b     2     2

这可能并不复杂,但我有精神障碍,因为它主要涉及计算每个ID的订单而不重复因子级别,然后按ID进行汇总,最后总结每个类别。

2 个答案:

答案 0 :(得分:1)

在每个ID中,您可以将因子的级别设置为它们在该组中出现的顺序,然后通过as.numeric将因子转换为整数以形成新变量。这取决于数据集的顺序,因此,如果事情不符合要求,则应{id}和id arrange

transactions %>%
    arrange(id, date) %>%
    group_by(id) %>%
    mutate(category_order = as.numeric(factor(category, levels = unique(category))))

答案 1 :(得分:1)

这也可以使用data.table完成。我们转换了&#39; data.frame&#39;到&#39; data.table&#39; (setDT(transactions)),按&#39; id&#39;分组,指定&#39; i&#39;部分order的&#39; id&#39;和&#39; date&#39;,转换&#39;类别&#39;通过将factor指定为&#39;类别&#39;中的levels元素,将其强制转换为unique,并将其强制转换为&#39;整数&#39;并将(:=)输出分配给&#39; category_order&#39;

library(data.table)
setDT(transactions)[order(id, date), category_order := as.integer(factor(category,
            levels = unique(category))) , by = id]

head(transactions)
#   id       date category category_order
#1:  1 2011-07-01        a              1
#2:  2 2011-07-02        b              1
#3:  3 2011-07-03        c              1
#4:  4 2011-07-04        d              1
#5:  5 2011-07-05        a              1
#6:  1 2011-07-06        b              2