子集,多列中的所有可能组合

时间:2014-06-11 10:27:12

标签: r excel excel-vba combinations vba

寻找帮助创建Excel脚本以生成所有可能的数据组合。这是我拥有的和我正在寻找的一个例子。 ID是子集标识号,AID是该子集中的参与者。

ID  AID
 1   30
 1   52
 1   10
 1   20
 2   10
 2   11
 2   50

需要:

ID  AID  AID1
 1   30   52
 1   30   10
 1   30   20
 1   52   10
 1   52   20
 1   10   20
 2   10   11
 2   10   50
 2   11   50

非常感谢任何帮助。希望在Excel中执行此操作,但R也可以正常工作。谢谢!

3 个答案:

答案 0 :(得分:1)

看起来你实际上没有所有组合。您是否考虑过使用SQL来解决问题?您可以使用R中的包sqldf来执行此操作,并将数据与自身交叉连接。这给出了所有组合:

library(sqldf)

sqldf("select a.ID, a.AID, b.AID AID1
       FROM data a 
       JOIN data b ON a.ID = b.ID")

,这给出了问题中显示的输出:

sqldf("select a.ID, a.AID, b.AID AID1
       FROM data a 
       JOIN data b ON a.ID = b.ID and a.rowid < b.rowid")

答案 1 :(得分:0)

dat <- read.table(text="
ID  AID
1   30
1   52
1   10
1   20
2   10
2   11
2   50",sep="",header=TRUE)


res <- do.call(rbind,lapply(split(dat, dat$ID), function(x)    {setNames(data.frame(x$ID[1], t(combn(x$AID,2))),c("ID", paste0("AID",c("",1))))}))
row.names(res) <- 1:nrow(res)

出现这种错误的一种可能性是:

dat <- structure(list(ID = c(1L, 1L, 1L, 1L, 2L), AID = c(30L, 52L, 
10L, 20L, 1L)), .Names = c("ID", "AID"), class = "data.frame", row.names = c(NA, 
-5L))

lapply(split(dat,dat$ID),function(x) combn(x$AID,2))
#Error in combn(x$AID, 2) : n < m

res <- do.call(rbind, lapply(split(dat, dat$ID), function(x) {
if (length(x$AID) > 1) 
    setNames(data.frame(x$ID[1], t(combn(x$AID, 2))), c("ID", paste0("AID", c("", 
        1)))) else transform(x, AID1 = AID)
}))

row.names(res) <- 1:nrow(res)

答案 2 :(得分:0)

这是一种类似于Guest的方法,但使用by按ID进行拆分。

z <- by(x$AID, x$ID, function(i) if(length(i)>1) combn(i,2) else NULL)
do.call(rbind, lapply(names(z), 
        function(i) if (is.null(z[[i]])) NULL else data.frame(ID=i, t(z[[i]])))
)
##   ID X1 X2
## 1  1 30 52
## 2  1 30 10
## 3  1 30 20
## 4  1 52 10
## 5  1 52 20
## 6  1 10 20
## 7  2 10 11
## 8  2 10 50
## 9  2 11 50

根据需要设置名称。

传递给NULL的函数返回

by,以便可以在lapply表达式中对其进行过滤。 rbind忽略NULL次输入。