在 R 中按 data.table 分组生成所有 ID 对
Generate All ID Pairs, by group with data.table in R
我有一个 data.table,在许多组中有许多人(具有 ID)。在每个组中,我想找到 ids 的每个组合(每对个体)。我知道如何使用 split-apply-combine 方法来做到这一点,但我希望 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]
提前致谢。
您需要将矩阵 t(combn())
的结果转换为 data.table
或 data.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
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))
然后您可以将列表更改为您可能需要的任何其他类型的格式。
我有一个 data.table,在许多组中有许多人(具有 ID)。在每个组中,我想找到 ids 的每个组合(每对个体)。我知道如何使用 split-apply-combine 方法来做到这一点,但我希望 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]
提前致谢。
您需要将矩阵 t(combn())
的结果转换为 data.table
或 data.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
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))
然后您可以将列表更改为您可能需要的任何其他类型的格式。