2

我有一个 data.table,其中包含许多组中的许多人(有 id)。在每个组中,我想找到每个 id 组合(每对个人)。我知道如何使用拆分应用组合方法来做到这一点,但我希望 data.table 会更快。

样本数据:

dat <- data.table(ids=1:20, groups=sample(x=c("A","B","C"), 20, replace=TRUE))

拆分应用组合方法:

datS <- split(dat, f=dat$groups)

datSc <- lapply(datS, function(x){ as.data.table(t(combn(x$ids, 2)))})

rbindlist(datSc)

head(rbindlist(datSc))
V1 V2
1:  2  5
2:  2 10
3:  2 19
4:  5 10
5:  5 19
6: 10 19

我最好的 data.table 尝试生成单列,而不是包含所有可能组合的两列:

dat[, combn(x=ids, m=2), by=groups]

提前致谢。

4

2 回答 2

9

您需要将结果从t(combn())矩阵转换为data.tabledata.frame,所以这应该工作:

library(data.table)  
set.seed(10)
dat <- data.table(ids=1:20, groups=sample(x=c("A","B","C"), 20, replace=TRUE))
dt <- dat[, as.data.table(t(combn(ids, 2))), .(groups)]
head(dt)
   groups V1 V2
1:      C  1  3
2:      C  1  5
3:      C  1  7
4:      C  1 10
5:      C  1 13
6:      C  1 14
于 2016-05-19T21:15:35.723 回答
1
library(data.table)  
dat <- data.table(ids=1:20, groups=sample(x=c("A","B","C"), 20, replace=TRUE))
ind<-unique(dat$groups)
lapply(1:length(ind), function (i) combn(dat$ids[which(dat$groups==ind[i])],2))

然后,您可以将列表更改为您可能需要的任何其他类型的格式。

于 2016-05-19T21:21:05.567 回答