寻找最常见的组合

时间:2017-08-03 17:56:48

标签: r

我有一个包含2列,ID号和品牌的数据框:

X1     X2
1234   A89
1234   A87
1234   A87
1234   A32
1234   A27
1234   A27
1235   A12
1235   A14
1235   A14
1236   A32
1236   A32
1236   A27
1236   A12
1236   A12
1236   A14
1236   A89
1236   A87
1237   A99
1237   A98

我想找到最常见的关于身份证号码的前3个品牌组合:

A89, A87
A32, A27
A12, A14

我试过了:     库(dplyr)

 df %>% 
  group_by(X1,X2) %>%
  mutate(n = n()) %>%
  group_by(X1) %>%
  slice(which.max(n)) %>%
  select(-n)

但它无法正常工作。我会很感激任何想法或想法!

4 个答案:

答案 0 :(得分:3)

这是在基础R中执行此操作的方法。我们将X2拆分为X1,然后为每个子组获取两个值的组合。然后我们抓住三个最常见的。

with(data.frame(table(unlist(lapply(split(df$X2, df$X1), function(x)
    combn(unique(x), min(2, length(x)), paste, collapse = "-"))))),
    as.character(Var1[head(order(Freq, decreasing = TRUE), 3)]))
#[1] "A12-A14" "A32-A27" "A89-A87"

数据

df = structure(list(X1 = c(1234L, 1234L, 1234L, 1234L, 1234L, 1234L, 
1235L, 1235L, 1235L, 1236L, 1236L, 1236L, 1236L, 1236L, 1236L, 
1236L, 1236L, 1237L, 1237L), X2 = c("A89", "A87", "A87", "A32", 
"A27", "A27", "A12", "A14", "A14", "A32", "A32", "A27", "A12", 
"A12", "A14", "A89", "A87", "A99", "A98")), .Names = c("X1", 
"X2"), class = "data.frame", row.names = c(NA, -19L))

答案 1 :(得分:1)

我不会使用which.max,而是坚持使用标准dplyr

库(dplyr)

df %>% 
  group_by(X1,X2) %>%
  mutate(n = n()) %>%
  group_by(X2) %>% # or X1? Unclear which is your sorting variable
  top_n(3, X2) %>% # Returns 3 rows for each, can be changed / also could be X1
  select(-n)

注意:如果存在关联,top_n将包含超过3

答案 2 :(得分:1)

以下是使用tapply分组的另一个基本R方法,combnpaste组合以获得成对组合。

names(tail(sort(table(unlist(tapply(df$X2, df$X1,
                                FUN=function(x) combn(unique(x), 2, paste, collapse="-"))))),
           3))
[1] "A12-A14" "A32-A27" "A89-A87"

combn(unique(x), 2, paste, collapse="-")唯一对并将它们粘贴在一起。 tapply按组执行此操作并返回列表。 unlist将此变为向量,table计算频率。这些频率从最小到最大排序,我们用tail获取最后3个频率。 namestable中提取该对而不是计数。

答案 3 :(得分:0)

另一种解决方案。首先,我们按组(X1)生成2个X2的所有组合,然后使用dplyr聚合和排列前3个。

combinations = as.data.frame(do.call(rbind,lapply(split(df,df$X1), function(x) 
    {t(combn(unique(x$X2),2))})))

combinations %>% 
group_by(V1,V2) %>% 
summarize(n=n()) %>% 
arrange(-n) %>% 
.[1:3,]

输出:

# A tibble: 3 x 3
# Groups:   V1 [3]
      V1     V2     n
  <fctr> <fctr> <int>
1    A12    A14     2
2    A32    A27     2
3    A89    A87     2