2016-07-12 2 views
0

данные:

  • Каждого наблюдение принадлежит к одной из трех групп; назовем их «a», «b» и «c».Создание таблиц by_group из списка векторов с inconsist длиной

  • Каждое наблюдение состоит из вектора идентификаторов (целые числа). Многие из идентификаторов перекрываются, но многие этого не делают. Там же легко более 1 миллиона уникальных значений, но быстро становится более управляемым #, когда я установил мин частота около 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 идентификаторов (по всем группам).

Проблема:

  • я могу генерировать таблицы с использованием базовых lapply и table функции, но они медленно, и он чувствует себя, как будто я что-то очевидное отсутствует. Плюс, у меня достаточно волн данных, что даже небольшая прибыль от эффективности делает мою жизнь заметно легче. Я только недавно начал использовать dplyr больше [вместо базовых функций R], и эффективность в эффективности была превосходной ... но я рисую пустую [таблицу] на этом.

Вопрос:

  • Кто-нибудь есть предложения о том, как эффективно создавать частотные таблицы, полученные из такого рода структуры данных? Я действительно люблю dplyr, поэтому обратная связь в этом направлении будет крутой, но я бы с удовольствием рассмотрел другие пакеты R, если это так. версия 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 
+0

Каков ваш ожидаемый результат – Bg1850

+0

Просьба показать, как вы делаете это в базе R, чтобы мы знали ожидаемый результат (даже если он медленный). –

+0

Опубликуйте в ближайшее время, когда я только что покинул свой офис. – mkearney

ответ

1

tidyr полезно в перепрофилирования здесь. Так как вам не очень важно идентифицировать, какой вектор, который, в первую очередь, просто unnest в длинную форму, которую вы можете протрубить в count, сгруппированный по обеим колонкам, что эквивалентно %>% table() %>% as_data_frame() или %>% group_by(group, ids) %>% summarise(n = n()), свертывание дублирующих наблюдений комбинации group/ids один ряд, добавив столбец частот n. spread ывая широкую форму позволяет сортировать по строкам сумм подсчетов, помещая наиболее часто встречающиеся цифры в верхней части:

library(tidyr) 

df %>% unnest(ids) %>% 
    count(group, ids) %>% 
    spread(group, n) %>% 
    arrange(desc(rowSums(.[,-1]))) 

## # A tibble: 10,001 x 4 
##  ids  a  b  c 
## <int> <int> <int> <int> 
## 1 10162 22 24 26 
## 2 8799 31 22 18 
## 3 1173 27 25 18 
## 4 2834 21 29 20 
## 5 3957 24 27 19 
## 6 4940 26 17 27 
## 7 7757 23 19 27 
## 8 5632 21 20 27 
## 9 7565 24 24 20 
## 10 10444 24 20 24 
## # ... with 9,991 more rows 

Он эффективно работает мгновенно на моей машине, несмотря на 450K строк.

Смежные вопросы