按组

时间:2016-09-28 13:28:47

标签: r combinations

我有一个包含两列的表格,iditem

df <- data.frame(id=c(1,1,2,2,2,2,3,3,3,4,4,4,4,4),item=c(1,2,3,1,2,3,4,1,2,3,1,2,1,2))

我希望找到每id个3个项目中最常见的组合(顺序无关紧要)。基本上,n选择r n = number of items within idr = 3。每id个项目的数量会有所不同 - 有些项目的数量超过3个,有些项目的数量更少。

我是R的新手并阅读有关combnexpand.grid的内容,但我不知道如何在我的案例中使用它们(在每个id内工作)。

Find most frequent combination of values in a data.frame”是我找到的最接近的问题。

编辑:基于该示例的预期答案是组合“1,2,3”,它出现在id 2和4中。

3 个答案:

答案 0 :(得分:2)

以下是使用dplyr

的一个想法
df1 <- df %>% 
        group_by(id) %>% 
        arrange(item) %>% 
        summarise(new = paste(unique(combn(item, length(unique(item)), toString)), collapse = '/'))
df1
# A tibble: 4 × 2
#     id                                             new
#  <dbl>                                           <chr>
#1     1                                            1, 2
#2     2                     1, 2, 3 / 1, 3, 3 / 2, 3, 3
#3     3                                         1, 2, 4
#4     4 1, 1, 2 / 1, 1, 3 / 1, 2, 2 / 1, 2, 3 / 2, 2, 3

names(sort(table(unlist(strsplit(df1$new, '/'))), decreasing = TRUE)[1])
#[1] "1, 2, 3"

答案 1 :(得分:0)

library(dplyr)
grouped <- df %>% group_by(id,item) %>% summarize(count = n()) %>% arrange(desc(count))

瞧。最高计数从最高到最低排序。

编辑:刚刚意识到我没有完全回答你的问题。我希望我给你一个良好的开端。

答案 2 :(得分:0)

我认为这是你想要的基础R(不需要包装):

a <- aggregate(item~id, df, unique)
a <- lapply(a$item, 'length<-', max(lengths(a$item)))
m <- matrix(unlist(a), ncol=3, byrow = T)
m <- t(apply(m,1,function(x) sort(x,na.last = T)))

#     [,1] [,2] [,3]
#[1,]    1    2   NA
#[2,]    1    2    3
#[3,]    1    2    4
#[4,]    1    2    3

一旦我们得到矩阵m,矩阵中最常见的行就是你想要的:

t <- table(apply(m, 1, paste, collapse = "/")) 
as.numeric(strsplit(names(which.max(t)), "/")[[1]]) 

#[1] 1 2 3