首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >累计计算多年内不同用户的总数

累计计算多年内不同用户的总数
EN

Stack Overflow用户
提问于 2021-03-08 21:02:34
回答 2查看 88关注 0票数 2

假设我有这样一个data.frame:

代码语言:javascript
复制
user_df = read.table(text = "id industry year
1 Government 1999
2 Government 1999
3 Government 1999
4 Private 1999
5 NGO 1999
1 Government 2000
2 Government 2000
3 Government 2000
4 Government 2000
1 Government 2001
5 Government 2001
2 Private 2001
3 Private 2001
4 Private 2001", header = T)

对于每个用户,我都有一个唯一的idindustryyear

我试图计算曾经在政府工作过的人的累计数量,因此,累积统计应该是对该年和前几年唯一用户总数的统计。

我知道我可以像这样做一个普通的累积总和:

代码语言:javascript
复制
user_df %>% group_by(year, industry) %>% summarize(cum_sum = cumsum(n_distinct(id)))

   year industry   cum_sum
  <int> <chr>        <int>
1  1999 Government       3
2  1999 NGO              1
3  1999 Private          1
4  2000 Government       4
5  2001 Government       2
6  2001 Private          3

然而,这不是我想要的,因为今年的20002001将包括已经包括在1999中的人。我希望每年都能累计统计在某一年曾在政府工作过的独特用户的总数。我无法在dplyr中找到正确的方法来做到这一点。

因此正确的输出应该如下所示:

代码语言:javascript
复制
   year industry   cum_sum
  <int> <chr>        <int>
1  1999 Government       3
2  1999 NGO              1
3  1999 Private          1
4  2000 Government       4
5  2001 Government       5
6  2001 Private          3
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-08 21:22:11

一种选择可能是:

代码语言:javascript
复制
user_df %>%
 group_by(industry) %>%
 mutate(cum_sum = cumsum(!duplicated(id))) %>%
 group_by(year, industry) %>%
 summarise(cum_sum = max(cum_sum))

   year industry   cum_sum
  <int> <fct>        <int>
1  1999 Government       3
2  1999 NGO              1
3  1999 Private          1
4  2000 Government       4
5  2001 Government       5
6  2001 Private          3
票数 5
EN

Stack Overflow用户

发布于 2021-03-08 21:22:32

1) sqldf,这可以通过在sql中实现复杂的自连接来实现。它将每行连接到具有相同行业和相同年份或之前的行,然后按年份对它们进行分组,并对计算不同id的行业进行分组。

代码语言:javascript
复制
library(sqldf)
sqldf("select a.year, a.industry, count(distinct b.id) cum_sum
  from user_df a
  left join user_df b on b.industry = a.industry and b.year <= a.year
  group by a.year, a.industry")

给予:

代码语言:javascript
复制
  year   industry cum_sum
1 1999 Government       3
2 1999        NGO       1
3 1999    Private       1
4 2000 Government       4
5 2001 Government       5
6 2001    Private       3

2)基础--一个基础解决方案是将工业上的数据框架与自身进行合并,然后将子集合并到同一年或更早的年份,然后按行业和年份进行聚合。这是低效的,因为与SQL语句不同,SQL语句在加入时过滤,这会在过滤之前创建整个联接;但是,如果数据不太大,这可能就足够了。

代码语言:javascript
复制
m <- merge(user_df, user_df, by = "indstry")
s <- subset(m, year.y <= year.x)
ag <- aggregate(id.y ~ industry + year.x, s, function(x) length(unique(x)))
names(ag) <- sub("\\..*", "", names(ag))
ag

给予:

代码语言:javascript
复制
    industry year id
1 Government 1999  3
2        NGO 1999  1
3    Private 1999  1
4 Government 2000  4
5 Government 2001  5
6    Private 2001  3
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66537151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档