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_ID
89和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 的预期答案。
与 的区别在于它避免了重复计数和自引用,即 From
和 To
相等。
数据
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")
这是我刚刚在这里发布的一个问题的后续(为上下文提供 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_ID
89和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 的预期答案。
与 From
和 To
相等。
数据
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")