本文介绍了R - 计算所有组合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想计算 data.frame 中的所有组合.
I would like to count all combinations in a data.frame.
数据是这样的
9 10 11 12
1 1 1 1 1
2 0 0 0 0
3 0 0 0 0
4 1 1 1 1
5 1 1 1 1
6 0 0 0 0
7 1 0 0 1
8 1 0 0 1
9 1 1 1 1
10 1 1 1 1
我想要的输出很简单
comb n
1 1 1 1 5
0 0 0 0 3
1 0 0 1 2
你知道有什么简单的函数可以做到这一点吗?
Do you know any simple function to do that ?
谢谢
dt = structure(list(`9` = c(1, 0, 0, 1, 1, 0, 1, 1, 1, 1), `10` = c(1,
0, 0, 1, 1, 0, 0, 0, 1, 1), `11` = c(1, 0, 0, 1, 1, 0, 0, 0,
1, 1), `12` = c(1, 0, 0, 1, 1, 0, 1, 1, 1, 1)), .Names = c("9",
"10", "11", "12"), class = "data.frame", row.names = c(NA, -10L
))
推荐答案
我们可以使用 data.table
或 dplyr
.这些都是非常有效的.我们将'data.frame'转换为'data.table'(setDT(dt)
),按'dt'的所有列分组(names(dt)
), 我们得到 nrow (.N
) 作为 'Count'
We can either use data.table
or dplyr
. These are very efficient. We convert the 'data.frame' to 'data.table' (setDT(dt)
), grouped by all the columns of 'dt' (names(dt)
), we get the nrow (.N
) as the 'Count'
library(data.table)
setDT(dt)[,list(Count=.N) ,names(dt)]
或者我们可以使用类似的方法使用 dplyr
.
library(dplyr)
names(dt) <- make.names(names(dt))
dt %>%
group_by_(.dots=names(dt)) %>%
summarise(count= n())
基准
万一有人想查看一些指标(以及之前支持我的声明(高效!
)),
set.seed(24)
df1 <- as.data.frame(matrix(sample(0:1, 1e6*6, replace=TRUE), ncol=6))
akrunDT <- function() {
as.data.table(df1)[,list(Count=.N) ,names(df1)]
}
akrunDplyr <- function() {
df1 %>%
group_by_(.dots=names(df1)) %>%
summarise(count= n())
}
cathG <- function() {
aggregate(cbind(n = 1:nrow(df1))~., df1, length)
}
docendoD <- function() {
as.data.frame(table(comb = do.call(paste, df1)))
}
deena <- function() {
table(apply(df1, 1, paste, collapse = ","))
}
这是微基准
结果
library(microbenchmark)
microbenchmark(akrunDT(), akrunDplyr(), cathG(), docendoD(), deena(),
unit='relative', times=20L)
# Unit: relative
# expr min lq mean median uq max neval cld
# akrunDT() 1.000000 1.000000 1.000000 1.00000 1.000000 1.0000000 20 a
# akrunDplyr() 1.512354 1.523357 1.307724 1.45907 1.365928 0.7539773 20 a
# cathG() 43.893946 43.592062 37.008677 42.10787 38.556726 17.9834245 20 c
# docendoD() 18.778534 19.843255 16.560827 18.85707 17.296812 8.2688541 20 b
# deena() 90.391417 89.449547 74.607662 85.16295 77.316143 34.6962954 20 d
这篇关于R - 计算所有组合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!