从长度不一致的向量列表中创建表by_group

时间:2016-07-12 19:23:24

标签: r dplyr frequency

数据:

  • 每次观察属于三组中的一组;我们称之为“a”,“b”和“c”。

  • 每个观察都包含一个id(整数)向量。许多ID重叠,但许多不重复。有超过100万个唯一值,但当我设置10或20左右的最小频率时,它很快变得更容易管理。

  • 生成的随机数据类似于原始数据:

    set.seed(21) #GoSpursGo
    random_id <- function(n) sample(1111:11111, n, replace = TRUE)
    ids <- replicate(1000, random_id(sample(200:700, 400)))
    group <- sample(c("a", "b", "c"), 1000, replace = TRUE)
    df <- dplyr::data_frame(group = group, ids = ids)
    df
    
    ## Source: local data frame [1,000 x 2]
    ## 
    ## group         ids
    ## <chr>      <list>
    ## 1      b <int [593]>
    ## 2      a <int [444]>
    ## 3      b <int [605]>
    ## 4      b <int [263]>
    ## 5      a <int [274]>
    ## 6      c <int [450]>
    ## 7      c <int [656]>
    ## 8      b <int [687]>
    ## 9      a <int [302]>
    ## 10     a <int [234]>
    ## ..   ...         ...
    

目的:

  • 我想为每个组创建一个表,其中描述了前1000个ID(跨所有组)的频率。

问题:

  • 我可以使用基本的lapplytable函数生成表格,但它们很慢,感觉我错过了一些明显的东西。另外,我已经掌握了足够多的数据,即使效率上的微小提升也会让我的生活变得更加轻松。我最近才开始使用dplyr更多[代替基本R函数],效率的提升非常好......但是我在这个方面做了一个空白的[表]。

问题:

  • 有人建议如何有效地创建从这种数据结构派生的频率表?我现在真的很喜欢dplyr,所以这方面的反馈会很酷,但如果是这样,我很乐意考虑寻找其他R套餐。

Base R版本:

## base R
base_tbl <- sapply(unique(df$group), function(x) 
  table(unlist(df$ids[df$group == x])))
  base_tb <- data.frame(
    ids = row.names(base_tbl), 
    base_tbl, 
    row.names = NULL,
    stringsAsFactors = FALSE)
head(base_tb)
## ids  b  a  c
## 1 1111 21 19 16
## 2 1112 17 19 17
## 3 1113 15 16 12
## 4 1114 12 16 17
## 5 1115 10 14 17
## 6 1116  8 23 17

1 个答案:

答案 0 :(得分:1)

tidyr有助于重塑此处。由于您并不真正关心识别哪个向量,首先只需unnest为长形式,您可以将其导入count按两列分组,这相当于{{1} }或%>% table() %>% as_data_frame(),将%>% group_by(group, ids) %>% summarise(n = n()) / group组合的重复观察值折叠为单行,添加ids频率列。 n宽范围允许您按计数的行总和进行排序,将最常出现的数字放在顶部:

spread

尽管有450k行,它仍能在我的机器上即时运行。