【问题标题】:Count Order of Factor Level Occurance因子水平出现的计数顺序
【发布时间】:2017-01-02 13:15:56
【问题描述】:

我的交易数据集包含几个变量,包括 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,如果一个类别重复,它必须具有相同的 order 值。在上面的例子中,a 总是第 1,b 总是第 2,等等。

我要做的是计算每个类别是第 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 汇总,最后按类别汇总。

【问题讨论】:

  • 您能否举一个数据集的示例以及当因子“无序”时最终输出的样子?您当前的示例可以通过as.numeric(transactions$category) 解决,但我猜您的实际情况有些混淆了类别。
  • table(或as.data.frame.table,如果需要长格式)已经按照要求执行了吗?所以我想我真正的问题是“人们在寻求 dplyr/tidyr 解决方案之前不应该学习基础 R 吗?”
  • 我的实际数据集是机密的,但数据类型与上面的相同。也许问题不清楚 - 我想要做的是计算每个类别是第 1、第 2、第 3 等的次数,以获得 a 是第 1 次、b 是第 1 次、a 是第 2 次的次数的频率分布,等等。我会在上面编辑。
  • @42 不,它没有,这就是我发布问题的原因......

标签: r dplyr


【解决方案1】:

这也可以通过data.table 完成。我们将'data.frame'转换为'data.table'(setDT(transactions)),按'id'分组,用'id'和'date'的order指定'i'部分,转换'category'通过将levels 指定为'category' 中的unique 元素进入factor,将其强制为'integer' 并将输出分配(:=)给'category_order'

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

【讨论】:

    【解决方案2】:

    在每个 id 中,您可以将因子的级别设置为它们在该组中出现的顺序,然后通过 as.numeric 将因子转换为整数以形成新变量。这取决于数据集的顺序,所以如果事情不正常,您应该按 id 和日期arrange

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      • 2019-08-26
      • 1970-01-01
      相关资源
      最近更新 更多