我有一个非常大的数据框,如下所示:
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)
根据以上信息,我想
创建一个变量,用于计算su的所有项目的dlq值== 1的连续月数。
计算至少1个商品代码的值为1的连续月数。例如,如果月份等于201102(即2011年2月),则项目045110B238A02具有item.dlq == 0,因此只有2/3项目有dlq == 1.
请注意,上例中只有一个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?如果没有,任何其他方法都会受到欢迎。如果有什么不明确请评论,我会改变它。无论哪种方式,任何帮助或建议将不胜感激。非常感谢!