寻找帮助创建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也可以正常工作。谢谢!
答案 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
次输入。