我有一个这样的数据库:
dat = data.frame(id = c(rep("Adam", 5), rep("Bob", 10)),
card_id = c(rep("0001", 2), rep("0002", 3), rep("0003", 5), rep("0004", 5)),
bill_date = c("2017-01", "2017-02",
"2017-01", "2017-02", "2017-03",
"2017-01", "2017-02", "2017-03", "2017-05", "2017-06",
"2017-01", "2017-02", "2017-03", "2017-04", "2017-05"), stringsAsFactors = F)
# id card_id bill_date
# 1 Adam 0001 2017-01
# 2 Adam 0001 2017-02
# 3 Adam 0002 2017-01
# 4 Adam 0002 2017-02
# 5 Adam 0002 2017-03
# 6 Bob 0003 2017-01
# 7 Bob 0003 2017-02
# 8 Bob 0003 2017-03
# 9 Bob 0003 2017-05
# 10 Bob 0003 2017-06
# 11 Bob 0004 2017-01
# 12 Bob 0004 2017-02
# 13 Bob 0004 2017-03
# 14 Bob 0004 2017-04
# 15 Bob 0004 2017-05
我想获取每个id
的每个card_id
的最大连续帐单数量。
预期结果:
# id card_id max_cont_bill_num
# 1 Adam 0001 2
# 2 Adam 0002 3
# 3 Bob 0003 3
# 4 Bob 0004 5
最佳答案
我们可以尝试使用difftime
和rle
。创建一个函数将'bill_date'转换为Date
,类,获取相邻日期的差异,转换为整数,然后获取值的run-length-id,选择最大值长度
。按“id”、“card_id”分组后应用该函数
f1 <- function(x) {
x1 <- as.Date(paste0(x, "-01") )
x2 <- as.integer(difftime(x1[-1], x1[-length(x1)], unit = "weeks"))
max(rle(c(x2[1], x2))$lengths)
}
dat %>%
group_by(id, card_id) %>%
summarise(max_count = f1(bill_date))
# A tibble: 4 x 3
# Groups: id [?]
# id card_id max_count
# <chr> <chr> <int>
#1 Adam 0001 2
#2 Adam 0002 3
#3 Bob 0003 3
#4 Bob 0004 5
关于R 通过id计算日期变量的连续数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52752002/