首页 > 解决方案 > 如何根据字符变量中的唯一值获取累积和?

问题描述

我有 df 代表用户随时间的浏览行为。因此,df 包含一个唯一的 UserId,每一行都有一个时间戳,代表对某个网站的访问。每个网站都有一个唯一的网站 ID 和一个唯一的网站类别,例如 c("electronics", "clothes",....)。现在我想每行计算用户访问了该行(包括该行)的每个类别的唯一网站数量。我将此变量称为“宽度”,因为它代表了用户浏览互联网的范围。

到目前为止,我只设法生成愚蠢的代码,通过过滤每个类别来创建每个类别访问的唯一网站的总数,然后获取用户唯一向量的长度,然后进行左连接。因此,随着时间的推移,我确实会丢失有关发展的信息。

提前非常感谢!

total_breadth <- df %>% filter(category=="electronics")  %>% 
                         group_by(user_id) %>% 
                           mutate(breadth=length(unique(website_id)))


#Structure of the df I want to achieve:

user_id   time   website_id  category     breadth

1         1      70         "electronics" 1 
1         2      93         "clothing"    1
1         3      34         "electronics" 2
1         4      93         "clothing"    1
1         5      26         "electronics" 3
1         6      70         "electronics" 3  

#Structure of the df I produce:

user_id   time   website_id  category     breadth

1         1      70         "electronics" 3 
1         2      93         "clothing"    1
1         3      34         "electronics" 3
1         4      93         "clothing"    1
1         5      26         "electronics" 3
1         6      70         "electronics" 3

标签: rdata-manipulation

解决方案


这似乎是拆分、应用和组合的情况。创建一个由 1 和 0 组成的二进制矩阵,其维数为:

  • 行数 = 原始数据中的行数
  • 列数 = 唯一网站类别数

每行代表时间戳,每列代表各自的网站类别。因此,当且仅当用户在相应的时间戳上访问了该网站类别的网站时,单元格将等于 1,否则它将为 0。

获取此矩阵的各个列的累积总和,然后创建最后一列,其中仅获取相应时间戳上已访问网站类别的值。

虽然这似乎不是一个优雅的解决方案,但希望这能暂时解决您的问题。


推荐阅读