R 寻找最频繁的组合

R 寻找最频繁的组合,r,R,我有一个数据框,有两列,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 我想找出在身份证号码

我有一个数据框,有两列,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)


但它不能正常工作。如果有任何想法或想法,我将不胜感激

这里有一种在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))

另一种解决办法。首先,我们按组(X1)生成X2中2个的所有组合,然后使用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
#一个tible:3 x 3
#分组:V1[3]
V1 V2 n
1 A12 A14 2
2 A32 A27 2
3 A89 A87 2

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

图书馆(dplyr)


注:
top\n
如果有关联,则将包含多于
3行的
这里是另一种基本R方法,使用
tapply
分组和
combn
粘贴
获得成对组合

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(唯一(x),2,粘贴,折叠=“-”
unique对并将它们粘贴在一起
tapply
按组执行此操作并返回列表<代码>取消列表
将其转换为向量,然后
表格
计算频率。这些频率从最小到最大排序,我们用
tail
获取最后3个<代码>名称
中提取配对,而不是计数

我尝试了此操作,但我的完整数据集出现问题。我得到的错误是“组合中的错误(唯一(x),2,粘贴,折叠=“-”):ndf=df[sapply(df,function(x)length(unique(x)))>1]进行初始子集设置来实现这一点。这适用于较小的数据集,但不适用于较大的数据集,因为错误ncombn
,所以你可以将
函数(x)combn(unique(x),2,paste,collapse=“-”)更改为
函数(x),如果(length(x)>1)combn(unique(x),2,paste,collapse=“-”),否则NA
应该可以正常运行。
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)
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"