r - 如何在 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 个项目。
解决方案
这很简单,使用矩阵,特别是关联矩阵和邻接矩阵。我会注意到,这将更适合您的 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,它
会将它视为两个不同的对,而我需要它来理解
它是同一对。
推荐阅读
- http - 如何处理 HTTP 请求标头中的非 ascii 字符?
- spring - Kubernetes ingress-nginx 粘性会话不适用于 Spring Security
- python - Python:用它的表达式替换函数,在数学表达式中作为字符串,用 Sympy?
- sql - SQL Server - 跳过“假”IF 语句,但仍需要通常的时间?
- react-native - react-native 中的 fetch() 函数抛出“网络请求失败”错误
- linux - dma_mmap_coherent() 映射内存的零拷贝用户空间 TCP 发送
- ajax - 如何在每页加载特定数量的记录并添加更多按钮
- spring - 如何搜索嵌套数组并仅使用 mongo 和 springdata 检索匹配的元素
- python - 使用 Prometheus 的 InfoMetricFamily 在 Grafana 中进行表格可视化
- excel - 如果密码不正确则关闭工作簿