如何基于列表列的元素获取行数?

时间:2019-04-12 10:38:02

标签: r list dataframe

我有一个包含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循环完成了此工作,将每个列表取消列出一列,然后对整个对象进行计数,但这似乎是一种效率很低的编码方式。我不清楚如何处理由列表组成的列的数据,理想情况下,我想将这样的操作向量化。

2 个答案:

答案 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))