我想要按((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_id
或multiple
?任何建议或意见将不胜感激。
上面的数据集:
monthly-yearly
答案 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
工作原理
要细分其工作原理,请尝试部分运行,直到]
之前的每个%>%
或括号。
它...
rleid
对每个plan
值的运行进行分组; 它不使用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