0

我试图在 5 个变量中找到最常见的对,与这个问题非常相似。主要区别是我还有一个变量,我想将它们分组。

data.frame':   430 obs. of  6 variables:
 $ group: chr  "Celtics" "Pelicans" "Suns" ...
 $ X1  : int  7 9 22 15 34 11 21 35 33 43 ...
 $ X2  : int  22 16 31 40 49 15 11 13 41 50 ...
 $ X3  : int  30 17 36 32 29 36 41 34 1 2 ...
 $ X4  : int  48 29 8 45 21 9 6 6 18 8 ...
 $ X5  : int  16 39 32 12 27 43 12 15 23 7 ...
 

我想要的输出如下所示:

   group             Pair                   n
   <chr>             <dbl>                  <dbl>
 1 Suns              41-23                  30

我还没有很好地掌握将 combn 函数与 group_by 和 dplyr mutate 一起使用来完成这项工作。任何帮助,将不胜感激。

4

1 回答 1

0

您可以编写自定义函数(从上一个答案中获取帮助)

return_pairs <- function(data, id) {
  vals <- sort(table(apply(data, 1, function(x) 
              combn(x, 2, paste, collapse="-"))), decreasing = TRUE) 
 
  data.frame(id = id, 
             pair = names(vals), 
             Freq = as.numeric(vals))
}

按组拆分数据并应用该函数。

library(purrr)
library(dplyr)

imap_dfr(split(df[-1], df$id), return_pairs) %>%
  group_by(id) %>%
  #to select  top 5 values for each id
  slice_max(Freq, n = 5)

#   id    pair  Freq   
#   <chr> <chr> <dbl>
# 1 1     4-4   12     
# 2 1     4-3   10     
# 3 1     1-1    8     
# 4 1     1-3    8     
# 5 1     2-3    7     
# 6 1     3-3    7     
# 7 1     4-1    7     
# 8 2     2-4   14     
# 9 2     3-4    9     
#10 2     4-1    9     
#11 2     4-3    9     
#12 2     4-4    9     
#13 3     3-2    7     
#14 3     2-3    6     
#15 3     4-4    6     
#16 3     2-2    5     
#17 3     2-4    5     

数据

如果您以可重现的格式提供数据,则更容易提供帮助

set.seed(1234)
df <- data.frame(id = rep(c(1, 2, 3), c(10, 10, 5)),
                 X1=sample(1:4, 25, replace=TRUE),
                 X2=sample(1:4, 25, replace=TRUE),
                 X3=sample(1:4, 25, replace=TRUE),
                 X4=sample(1:4, 25, replace=TRUE),
                 X5=sample(1:4, 25, replace=TRUE))
于 2021-09-20T04:27:14.743 回答