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