每次观察属于三组中的一组;我们称之为“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]>
## .. ... ...
lapply
和table
函数生成表格,但它们很慢,感觉我错过了一些明显的东西。另外,我已经掌握了足够多的数据,即使效率上的微小提升也会让我的生活变得更加轻松。我最近才开始使用dplyr
更多[代替基本R函数],效率的提升非常好......但是我在这个方面做了一个空白的[表]。dplyr
,所以这方面的反馈会很酷,但如果是这样,我很乐意考虑寻找其他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 :(得分:1)
tidyr
有助于重塑此处。由于您并不真正关心识别哪个向量,首先只需unnest
为长形式,您可以将其导入count
按两列分组,这相当于{{1} }或%>% table() %>% as_data_frame()
,将%>% group_by(group, ids) %>% summarise(n = n())
/ group
组合的重复观察值折叠为单行,添加ids
频率列。 n
宽范围允许您按计数的行总和进行排序,将最常出现的数字放在顶部:
spread
尽管有450k行,它仍能在我的机器上即时运行。