我有一个包含2列的数据集。一个是客户ID,另一个是购买的产品列表。数据按ID排序。每行代表一个事务。我必须提取出交易次数最多的前20种产品。
所以数据可能看起来像:
ID |产品列表
1 | 92
2 | 88
2 | 88、89
2 | 88、91、90
3 | 130、88、90、92
3 | 130、88、90、92
3 | 130、88、91
3 | 130、88
3 | 130、88
我需要获得购买频率最高的前5种产品。产品ID在列表中不会重复。
我想避免使用for循环,这就是我现在停留的地方。
所以我的输出将是:
产品| Txns的数量
88 | 8
130 | 5
90 | 3
92 | 3
91 | 2
对不起,我不知道该如何格式化表格。我使用for循环完成了此工作,将每个列表取消列出一列,然后对整个对象进行计数,但这似乎是一种效率很低的编码方式。我不清楚如何处理由列表组成的列的数据,理想情况下,我想将这样的操作向量化。
答案 0 :(得分:1)
这应该有帮助:
library(tidyverse)
# example data
dt = data.frame(ID = 1:3,
Product_List = c("92","88, 89", "88, 92"), stringsAsFactors = F)
dt %>%
separate_rows(Product_List) %>% # split strings to different rows
count(Product_List) %>% # count elements
top_n(2, n) %>% # select top 2 based on counts
rename(No_of_Txns = n) # rename counts column
# # A tibble: 2 x 2
# Product_List No_of_Txns
# <chr> <int>
# 1 88 2
# 2 92 2
您可以将其更改为top_n(5, n)
,以获得实际示例中的前5名。
答案 1 :(得分:1)
类似于AntoniosK的解决方案:
library(dplyr)
library(tidyr)
df %>%
separate_rows(Product_List) %>%
group_by(Product_List) %>%
summarise(No_of_Txns = n()) %>%
arrange(desc(No_of_Txns))