在 R 中计算分类变量的组合,无论顺序如何?
Count combinations of categorical variables, regardless of order, in R?
感谢您的帮助!我在 R 中有一个数据框,其中包含两列分类变量,如下所示:
rowA <- c("Square", "Circle", "Triangle", "Square", "Circle", "Triangle", "Square", "Circle", "Triangle")
rowB <- c("Circle", "Square", "Square", "Square", "Circle", "Circle", "Triangle", "Triangle", "Triangle")
df1 <- data.frame(rowA, rowB)
print(df1)
当我们打印出来时,它看起来像这样:
rowA rowB
1 Square Circle
2 Circle Square
3 Triangle Square
4 Square Square
5 Circle Circle
6 Triangle Circle
7 Square Triangle
8 Circle Triangle
9 Triangle Triangle
我想统计 rowA 和 rowB 中每个类别组合的出现频率。这就是我所挂断的——组合是可逆的,这意味着“方形 - 圆形”对于我们的目的与“圆形 - 方形”相同,我们希望将它们相加。理想的输出应该是这样的:
Pair Count
Square - Circle 2
Square - Triangle 2
Square - Square 1
Circle - Triangle 2
Circle - Circle 1
Triangle - Triangle 1
如果有人有任何建议,我会很高兴,谢谢!
编辑:Post 被标记为重复问题,但我不同意建议的帖子充分回答了我的问题(因此我首先提出了问题,经过大量挖掘)。非常感谢这里独特而简单的答案。
我们可以用 pmin/pmax
和 count
按行重新排列
library(dplyr)
library(stringr)
df1 %>%
count(Pair = str_c(pmin(rowA, rowB), ' - ',
pmax(rowA, rowB)), name = "Count")
-输出
Pair Count
1 Circle - Circle 1
2 Circle - Square 2
3 Circle - Triangle 2
4 Square - Square 1
5 Square - Triangle 2
6 Triangle - Triangle 1
另一种使用图表的方法
library(igraph)
library(magrittr)
df1 %>%
graph_from_data_frame(directed = FALSE) %>%
as_adjacency_matrix()
# Square Circle Triangle
# Square 1 2 2
# Circle 2 1 2
# Triangle 2 2 1
基础 R 解决方案是
combs <- apply(as.matrix(df1), 1, function(x) paste0(sort(x), collapse = " - "))
as.data.frame(table(combs))
#R> combs Freq
#R> 1 Circle - Circle 1
#R> 2 Circle - Square 2
#R> 3 Circle - Triangle 2
#R> 4 Square - Square 1
#R> 5 Square - Triangle 2
#R> 6 Triangle - Triangle 1
# in R 4.1.0 or later
as.matrix(df1) |>
apply(1, \(x) paste0(sort(x), collapse = " - ")) |>
table() |> as.data.frame() |>
setNames(c("Pair", "Count"))
#R> Pair Count
#R> 1 Circle - Circle 1
#R> 2 Circle - Square 2
#R> 3 Circle - Triangle 2
#R> 4 Square - Square 1
#R> 5 Square - Triangle 2
#R> 6 Triangle - Triangle 1
感谢您的帮助!我在 R 中有一个数据框,其中包含两列分类变量,如下所示:
rowA <- c("Square", "Circle", "Triangle", "Square", "Circle", "Triangle", "Square", "Circle", "Triangle")
rowB <- c("Circle", "Square", "Square", "Square", "Circle", "Circle", "Triangle", "Triangle", "Triangle")
df1 <- data.frame(rowA, rowB)
print(df1)
当我们打印出来时,它看起来像这样:
rowA rowB
1 Square Circle
2 Circle Square
3 Triangle Square
4 Square Square
5 Circle Circle
6 Triangle Circle
7 Square Triangle
8 Circle Triangle
9 Triangle Triangle
我想统计 rowA 和 rowB 中每个类别组合的出现频率。这就是我所挂断的——组合是可逆的,这意味着“方形 - 圆形”对于我们的目的与“圆形 - 方形”相同,我们希望将它们相加。理想的输出应该是这样的:
Pair Count
Square - Circle 2
Square - Triangle 2
Square - Square 1
Circle - Triangle 2
Circle - Circle 1
Triangle - Triangle 1
如果有人有任何建议,我会很高兴,谢谢!
编辑:Post 被标记为重复问题,但我不同意建议的帖子充分回答了我的问题(因此我首先提出了问题,经过大量挖掘)。非常感谢这里独特而简单的答案。
我们可以用 pmin/pmax
和 count
library(dplyr)
library(stringr)
df1 %>%
count(Pair = str_c(pmin(rowA, rowB), ' - ',
pmax(rowA, rowB)), name = "Count")
-输出
Pair Count
1 Circle - Circle 1
2 Circle - Square 2
3 Circle - Triangle 2
4 Square - Square 1
5 Square - Triangle 2
6 Triangle - Triangle 1
另一种使用图表的方法
library(igraph)
library(magrittr)
df1 %>%
graph_from_data_frame(directed = FALSE) %>%
as_adjacency_matrix()
# Square Circle Triangle
# Square 1 2 2
# Circle 2 1 2
# Triangle 2 2 1
基础 R 解决方案是
combs <- apply(as.matrix(df1), 1, function(x) paste0(sort(x), collapse = " - "))
as.data.frame(table(combs))
#R> combs Freq
#R> 1 Circle - Circle 1
#R> 2 Circle - Square 2
#R> 3 Circle - Triangle 2
#R> 4 Square - Square 1
#R> 5 Square - Triangle 2
#R> 6 Triangle - Triangle 1
# in R 4.1.0 or later
as.matrix(df1) |>
apply(1, \(x) paste0(sort(x), collapse = " - ")) |>
table() |> as.data.frame() |>
setNames(c("Pair", "Count"))
#R> Pair Count
#R> 1 Circle - Circle 1
#R> 2 Circle - Square 2
#R> 3 Circle - Triangle 2
#R> 4 Square - Square 1
#R> 5 Square - Triangle 2
#R> 6 Triangle - Triangle 1