我有一个包含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)
但它无法正常工作。我会很感激任何想法或想法!
答案 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方法,combn
与paste
组合以获得成对组合。
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个频率。 names
从table
中提取该对而不是计数。
答案 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