【问题标题】:How can I create groups that capture the many to many relationship in tidyverse?如何在 tidyverse 中创建捕获多对多关系的组?
【发布时间】:2020-10-15 12:52:27
【问题描述】:

我有一个相当棘手的问题,我似乎无法解决。考虑下表:

demo <- data.table(Person = c(1,2,2,3,4,5,6,4,7,8,9,10),
           Property = c("A","A","B","B","A","B","C","C","D","E","F","E"),
           Period = rep(2017, 12))

一个人可以拥有多个属性,一个人可以拥有多个属性,因此是多对多关系。但是,我想做的是通过聚合从这种多对多关系创建一对一的关系。我们可以说:一群人买了这些房产。

在我们的demo 案例中:

第 1 个人购买了 A 人2买了A 4人买了A 人2买了B 3人买了B 5人买了B 4人买了C 6人买了C

这组人 (1,2,3,4,5,6) 购买了房产 (A,B,C)。让我们将此组称为 G1,所以我想要一个表,将人员 1 到 6 链接到组 G1,并将属性 A 到 C 链接到 G1。

还可以找到以下其他组: 7 和 D,应链接到 G2 组

8、9和10这组人购买了E和F的属性。因此,这些应该链接到组G3。

一个结果应该给我们两个表,即:people_group 和 prop_Group。

people_group <- data.table(Person = c(1:10),
                           Group = c(rep("G1", 6), "G2", rep("G3", 3)))

prop_group <- data.table(Property = c("A", "B", "C", "D", "E", "F"),
                           Group = c(rep("G1", 3), "G2", rep("G3", 2)))

这也应该按周期完成,而不仅仅是2017。这在 tidyverse / data.table 中是否可行?

【问题讨论】:

  • 你确定只有3组吗,从我的回答看来有4组。
  • 确实有4组,因为9只与F相关。

标签: r dplyr data.table


【解决方案1】:

这是使用 igraph 的开始:

library(igraph)

# convert to graph object
g <- graph_from_data_frame(demo)
plot(g)

# get membership
x <- clusters(g)$membership

# add memberships
demo$grp <- x[ demo$Person ]

demo
#     Person Property Period grp
#  1:      1        A   2017   1
#  2:      2        A   2017   1
#  3:      2        B   2017   1
#  4:      3        B   2017   1
#  5:      4        A   2017   1
#  6:      5        B   2017   1
#  7:      6        C   2017   1
#  8:      4        C   2017   1
#  9:      7        D   2017   2
# 10:      8        E   2017   3
# 11:      9        F   2017   4
# 12:     10        E   2017   3

【讨论】:

    猜你喜欢
    • 2019-10-11
    • 2021-03-12
    • 2020-12-14
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    相关资源
    最近更新 更多