子集内的所有可能的组合

寻找一些帮助为Excel创build脚本来生成所有可能的数据组合。 这里是我有什么和我在找什么的例子。 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也可以。 谢谢!!

看起来不像你实际上有所有的组合。 你有没有考虑过使用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") 
 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) 

这里有一个和Guest相似的方法,但是用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以便可以在lapplyexpression式中过滤lapplyrbind忽略NULLinput。