首页 > 解决方案 > 如何在 R 的两列中找到多个值的组合(不是排列)?

问题描述

我有一个数据集,其中每一行代表一个项目。每个项目可能有几个人工作(2 到 6 人)。

列名是 id、person_1、person_2、person_3、person_4、person_5、person_6

如果一个项目的工作人员少于 6 人,则只填充前 n 列,其余为 NA。

我需要计算每对人一起工作的次数,他们一起工作的项目,以及对于每一对人,A 和 B 在 A 和 B 的总项目中所占的份额是多少,反之亦然。

我遇到的问题是:1)如果我有 person_1 A 和 person_2 B 以及 person_1 B 和 person_2 B,它会将它视为两个不同的对,而我需要它来理解它是同一对。2) 由于大多数项目只涉及 2 个人,我尝试了只有 2 列的配对,但我需要合并列 person_3 - person_6。

我也有这个不同格式的数据库,其中每一行代表一个人在一个项目上工作。在这种情况下,我的所有人都在同一列中,所以我的列是 project_id 和 name。

编辑:下面的例子

Data <- data.frame(
    id = c(1:4),
    person_1 = c("John", "Dan", "Peter", "James"),
person_2 = c("Dan", "John", "Kate", "Lisa"),
person_3 = c(NA, NA, "Kate", NA),
person_4 = c(NA, NA, "Peter", NA),
person_5 = c(NA, NA, NA, NA),
person_6 = c(NA, NA, NA, NA)
)

EDIT2:在我的实际数据集中,我有 667 个独特的人和 2442 个项目。

标签: rcombinations

解决方案


这很简单,使用矩阵,特别是关联矩阵和邻接矩阵。我会注意到,这将更适合您的 2 列数据集格式。

1) 将表格转换为关联矩阵(每行 1 个项目,每列 1 人),并将每个人分配的项目列表。

data_long <- reshape2::melt(Data, id.vars="proj_id", na.rm=TRUE)
proj_mat <- as.data.frame.table(table(data_long[-2]))
proj_mat <- reshape2::dcast(proj_mat, proj_id ~ value, value.var = "Freq")

#  proj_id Dan James John Kate Lisa Peter
#1      P1   1     0    1    0    0     0
#2      P2   1     0    1    0    0     0
#3      P3   0     0    0    2    0     2
#4      P4   0     1    0    0    1     0

2)要知道每对人一起完成了多少个项目,您可以简单地计算杰卡德指数。

proxy::dist(t(proj_mat[-1]), method = "jaccard")

#      Dan James John Kate Lisa
#James   1                     
#John    0     1               
#Kate    1     1    1          
#Lisa    1     0    1    1     
#Peter   1     1    1    0    1

3)为了得到共享项目的比例,我们计算邻接矩阵,然后除以它的对角线

proj_adj <- t(proj_mat[-1]) %*% as.matrix((proj_mat[-1]))
prop_together <- proj_adj/diag(proj_adj)
prop_together
#      Dan James John Kate Lisa Peter
#Dan     1     0    1    0    0     0
#James   0     1    0    0    1     0
#John    1     0    1    0    0     0
#Kate    0     0    0    1    0     1
#Lisa    0     1    0    0    1     0
#Peter   0     0    0    1    0     1

两个澄清:
1)凯特和彼得被分配到同一个项目两次。这4个是不同的人吗?您希望他们有 2 个共同项目还是 1 个?

2)我不关注你的第一个问题。“A”和“B”是指项目还是它们在初始表中的位置?您能否指出示例数据中的示例或在示例数据中添加示例。

如果我有 person_1 A 和 person_2 B 以及 person_1 B 和 person_2 B,它
会将它视为两个不同的对,而我需要它来理解
它是同一对。


推荐阅读