【发布时间】:2017-06-06 18:18:27
【问题描述】:
我有一个用户 ID 的数据集 test 以及用户 ID 进行交易的季度:
> test
id quarter
1 7 Q1
2 7 Q1
3 5 Q1
4 8 Q1
5 3 Q1
6 6 Q1
7 10 Q1
8 3 Q2
9 10 Q2
10 8 Q2
11 2 Q2
12 7 Q2
13 6 Q2
14 6 Q3
15 9 Q3
16 6 Q3
17 4 Q3
18 9 Q3
19 2 Q3
20 5 Q4
21 8 Q4
22 10 Q4
23 7 Q4
24 1 Q4
25 8 Q4
我的目标是找出在第 1 季度活跃的唯一用户数量,并在这些用户中获得在随后几个季度进行交易的用户数量。
上述示例的输出应该是:
> output
quarter unique_cohort_ids
1 Q1 6
2 Q2 5
3 Q3 1
4 Q4 4
以下代码有效,但冗长且重复,不适合包含数十个季度的大型数据集。任何有关如何改进它的建议将不胜感激:
subsets <-split(test, test$quarter, drop=TRUE)
for (i in 1:length(subsets)) {
assign(paste0("Q", i), as.data.frame(subsets[[i]]))
}
Q1_ids <- sum(uniqueQ1$id)
Q2_ids <- sum(unique(Q1$id) %in% unique(Q2$id))
Q3_ids <- sum(unique(Q1$id) %in% unique(Q3$id))
Q4_ids <- sum(unique(Q1$id) %in% unique(Q4$id))
群组分析还包括计算新用户的数量 每季度。与手动计算每个季度出现的、以前任何季度都没有出现的唯一用户 ID 不同,我正在寻求一种程序化的解决方案。在这种情况下,输出将是以下列表:
> mylist
[[1]]
[1] 7 5 8 3 6 10
[[2]]
[1] 2
[[3]]
[1] 9 4
[[4]]
[1] 1
任何建议将不胜感激
这里是示例数据:
> dput(test)
structure(list(id = c(7, 7, 5, 8, 3, 6, 10, 3, 10, 8, 2, 7, 6,
6, 9, 6, 4, 9, 2, 5, 8, 10, 7, 1, 8), quarter = c("Q1", "Q1",
"Q1", "Q1", "Q1", "Q1", "Q1", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2",
"Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q4", "Q4", "Q4", "Q4", "Q4",
"Q4")), .Names = c("id", "quarter"), row.names = c(NA, -25L), class = "data.frame")
【问题讨论】:
-
lapply也许?