R - 跨行计算值的组合(制作和弦图)

R - Count combinations of values across rows (to make a chord diagram)

这是我刚刚在这里发布的一个问题的后续(为上下文提供 link):

接下来我需要做的是根据 Text_ID 列计算值的组合。这是我的数据的示例:

Text_ID  Course_Code
39       MA3020
39       MA3120
59       MA3006
59       MA5902
89       MA2105
89       MA3006
89       MA5902
92       MA3023
92       MA3024
94       MA2023
94       MA3023
94       MA3024
97       MA3023
97       MA3024

明确地说,我要确定的是两个 Course_Code 共享同一个 Text_ID 的次数。我想有几种方法可以处理这个 and/or 呈现数据,但它看起来可能是这样的(仅供参考 - 我正在尝试将这些数据放入一个结构中,该结构将允许我创建一个和弦图,显示Course_Code):

之间的关系
From     To      Value
MA3020   MA3120  1
MA3006   MA5092  2
MA2105   MA3006  1
MA3023   MA3024  3
MA2023   MA3023  1

如您所见,MA3023 和 MA3024 的共同点最多 Text_ID (3)。

它变得有点复杂(我认为),因为两个以上的课程代码可以共享一个 Text_ID。例如。 Text_ID89和94都出现在三个以上不同的Course_Code

希望一切都清楚。如果没有,很乐意详细说明。最终,我的目标是将我的数据放入 format/structure 中,这样我就可以使用 Text_ID 作为共享值来可视化 Course_Code 之间的关系。如果有另一种方法可以解决这个问题,请随时提出建议:)

我们可以使用

subset(as.data.frame.table(crossprod(table(df1))), Freq != 0) 

或者,这可以使用 非等值自连接来解决:

library(data.table)
dt[, Course_Code := factor(Course_Code)]
dt[dt, on = c("Text_ID", "Course_Code < Course_Code"), 
   .(Text_ID, From = x.Course_Code, To = i.Course_Code), nomatch = NULL][
     , .N, by = .(From, To)]
     From     To N
1: MA3020 MA3120 1
2: MA3006 MA5902 2
3: MA2105 MA3006 1
4: MA2105 MA5902 1
5: MA3023 MA3024 3
6: MA2023 MA3023 1
7: MA2023 MA3024 1

显然,这重现了 OP 的预期答案。

的区别在于它避免了重复计数和自引用,即 FromTo 相等。

数据

library(data.table)
dt <- fread("Text_ID  Course_Code
39       MA3020
39       MA3120
59       MA3006
59       MA5902
89       MA2105
89       MA3006
89       MA5902
92       MA3023
92       MA3024
94       MA2023
94       MA3023
94       MA3024
97       MA3023
97       MA3024")