簡體   English   中英

從長度不一致的向量列表中創建表by_group

[英]Create tables by_group from list of vectors with inconsist lengths

數據:

  • 每個觀察值屬於三組之一; 我們稱它們為“ a”,“ b”和“ c”。

  • 每個觀察都由一個id(整數)向量組成。 許多ID重疊,但許多不重疊。 可以輕松地擁有超過一百萬個唯一值,但是當我將最小頻率設置為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

tidyr有助於重塑這里。 由於您實際上並不關心識別哪個向量,因此首先可以將其unnest為長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

盡管有45萬行,它仍可在我的計算機上即時有效運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM