计算r中因子水平的累积值

时间:2016-08-07 23:51:35

标签: r dataframe dplyr cumsum

我有一个非常大的数据框,如下所示:

month <- c(201101, 201101, 201101, 201102, 201102, 201102, 201103, 201103, 201103, 201104, 201104, 201104)
su <- as.factor(c(045110B238, 045110B238, 045110B238, 045110B238, 045110B238,045110B238, 045110B238, 045110B238, 045110B238, 045110B238, 045110B238, 045110B238))
item <- as.factor(c(045110B238A01, 045110B238A02, 045110B238A03, 045110B238A01, 045110B238A02, 045110B238A03, 045110B238A01, 045110B238A02, 045110B238A03, 045110B238A01, 045110B238A02, 045110B238A03))
item.dlq <- c(1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1)
df <- data.frame(month, su, item, item.dlq)

使用item.dlq变量我计算每个商品代码具有item.dlq == 1的累积月数:

library(dplyr)
df <- data.frame(df %>%
        group_by(itemcode, grp = cumsum(item.dlq == 0)) %>%
        mutate(item.cum.dlq = cumsum(item.dlq)))

应该给我一个这样的矢量:

item.cum.dlq <- c(1, 1, 1, 2, 0, 2, 3, 1, 3, 4, 2, 4)

根据以上信息,我想

  1. 创建一个变量,用于计算su的所有项目的dlq值== 1的连续月数。

  2. 计算至少1个商品代码的值为1的连续月数。例如,如果月份等于201102(即2011年2月),则项目045110B238A02具有item.dlq == 0,因此只有2/3项目有dlq == 1.

  3. 请注意,上例中只有一个su值,但在我正在使用的完整数据框中有很多。如果可能的话,我还想压缩数据帧,以避免携带不必要的观察。以下是未压缩的原始数据:

    su.cum.fulldlq <- c(1, 1, 1, 0, 0, 0, 1, 1, 1, 2, 2, 2) ## all items dlq ==1
    su.cum.partdlq <- c(0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0) ## at least 1 item but not all have dlq == 1
    

    如果数据框被压缩,它将如下所示:

    month <- c(201101, 201102, 201103, 201104)
    su <- c(045110B238, 045110B238, 045110B238, 045110B238)
    su.cum.fulldlq <- c(1, 0, 1, 2)
    su.cum.partdlq <- c(0, 1, 0, 0)
    

    我正在思考这方面的问题,但我不断收到错误消息。

    df <- data.frame(df %>%
       group_by(su, month)) %>%
       mutate(burden = n_distinct(itemcode)) # count number of items
       mutate(dlq.items = n_distinct(dlq == 1)) %>% # count number of items where dlq == 1
       mutate(full.dlq = ifelse(burden == dlq_items, 1, 0)) %>% # if number of items equals the number of items with dlq == 1, then full.dlq == 1.
    

    在此之后我完全不确定。

    有没有办法使用dplyr?如果没有,任何其他方法都会受到欢迎。如果有什么不明确请评论,我会改变它。无论哪种方式,任何帮助或建议将不胜感激。非常感谢!

0 个答案:

没有答案