2016-07-12 7 views
0

データの長さ:

  • 各観測は3つのグループのいずれかに属します。それらを "a"、 "b"、 "c"と呼んでみましょう。はinconsistでベクトルのリストからby_groupテーブルを作成することは

  • 各観測値は、ids(整数)のベクトルで構成されています。 IDの多くは重複していますが、多くは重複しません。そこ100万個のユニークな値より簡単だが、私は元のデータに似ているために発生した10個のまたは20

  • ランダムデータの周り分FREQ設定すると、それはすぐに、より管理しやすい#次のようになります。

    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パッケージを調べることを嬉しく思っています。

ベース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は、ここに整形するのに役立ちます。どちらのベクトルが%>% table() %>% as_data_frame()または%>% group_by(group, ids) %>% summarise(n = n())に等しいcountにパイプすることができる長い形式に最初にちょうどunnestを識別するために心配しないので、group/idsの組み合わせの重複した観測を崩壊する単一の行にn周波数列を追加します。広いフォームへspread ingが一番上に最も頻繁に発生する数字を入れて、カウントの行合計で並べ替えができます:それは450kの行にもかかわらず、私のマシン上で瞬時に効果的に実行さ

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 

関連する問題