聚合组合序列

时间:2017-09-22 17:54:22

标签: r dplyr data.table sequence

我想要按((988230014),CassandraRow{itemid: 988230014}) 聚合的样本数据集。每条记录代表一次注册。

user_id

每个用户都以不同的顺序(> test user_id time plan 1 1 2017-06-23 20:00:00 monthly 2 2 2017-07-20 20:00:00 monthly 3 3 2017-06-03 20:00:00 monthly 4 1 2017-07-03 20:00:00 monthly 5 2 2017-05-11 20:00:00 yearly 6 3 2017-07-27 20:00:00 yearly 7 1 2017-05-09 20:00:00 yearly 8 2 2017-01-15 19:00:00 yearly 9 3 2017-08-18 20:00:00 yearly 10 1 2017-01-30 19:00:00 monthly )注册了不同的计划。 例如,用户1的序列是time,因此用户1已经切换两次次。

用户2有monthly-yearly-monthly- monthly,因此用户2已切换一次

用户3已离开yearly-yearly-monthly,因此用户3已切换一次

monthly-yearly-yearly

我的目标是总结交换机的组合,换句话说,总结一下有多少用户从> test[order(test$time),] user_id time plan 8 2 2017-01-15 19:00:00 yearly 10 1 2017-01-30 19:00:00 monthly 7 1 2017-05-09 20:00:00 yearly 5 2 2017-05-11 20:00:00 yearly 3 3 2017-06-03 20:00:00 monthly 1 1 2017-06-23 20:00:00 monthly 4 1 2017-07-03 20:00:00 monthly 2 2 2017-07-20 20:00:00 monthly 6 3 2017-07-27 20:00:00 yearly 9 3 2017-08-18 20:00:00 yearly 转到yearly,有多少用户从monthly转到{{} 1}},有多少人多次切换计划。以下数据集的输出可能如下所示:

monthly

如何按yearly进行分组,然后将R中的字符串序列缩减为> output type count 1 monthly-yearly 1 2 yearly-monthly 1 3 multiple 1 user_idmultiple?任何建议或意见将不胜感激。

上面的数据集:

monthly-yearly

2 个答案:

答案 0 :(得分:4)

这是另一种方式:

test[order(user_id, time), 
  .(plan = first(plan))
, by=.(user_id, rleid(user_id, plan))][, 
  if (.N < 3L) paste(plan, collapse="-") 
  else "multiple"
, by=user_id][, 
  .N
, by=.(pattern = V1)]

#           pattern N
# 1:       multiple 1
# 2: yearly-monthly 1
# 3: monthly-yearly 1

转换为dplyr,建立在@AndrewGustar的回答:

library(dplyr)

test %>% 
    group_by(user_id) %>%
    arrange(time) %>% 
    summarise(pattern = 
      if (length(r <- rle(plan)$values) < 3) paste(r, collapse="-") 
      else "multiple"
    ) %>% 
    count(pattern)

# # A tibble: 3 x 2
#          pattern     n
#            <chr> <int>
# 1 monthly-yearly     1
# 2       multiple     1
# 3 yearly-monthly     1

工作原理

要细分其工作原理,请尝试部分运行,直到]之前的每个%>%或括号。

它...

  1. 使用rleid对每个plan值的运行进行分组;
  2. 按运行顺序汇总每个用户,为3 +的任何序列写“多个”;
  3. 并按这些摘要统计用户。
  4. 它不使用plan的特定值。

答案 1 :(得分:2)

以下是使用dplyr和有用的rle函数(行程编码)执行此操作的一种方法。

library(dplyr)

output <- test %>% group_by(user_id) %>% #group by id
      arrange(time) %>%                  #sort by date
      summarise(first=first(plan),switches=length(rle(plan)$values)) %>% 
                                         #find first plan and number of switches
      mutate(type=ifelse(switches>2,"multiple",
                     ifelse(first=="monthly","monthly-yearly","yearly-monthly"))) %>% 
                                         #convert these to your three types
      count(type)                        #short for group_by and n()

output
            type     n
           <chr> <int>
1 monthly-yearly     1
2       multiple     1
3 yearly-monthly     1