【问题标题】:all possible combinations within subset, multicolumn子集中所有可能的组合,多列
【发布时间】:2014-08-01 08:55:25
【问题描述】:

寻找一些帮助来为 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 也可以。谢谢!!

【问题讨论】:

  • AID1 到底是什么,即您要达到什么目的?
  • 请阅读 Excel 中的交叉连接。您可以轻松地在网上找到代码或获得一些额外的插件。

标签: r excel combinations vba


【解决方案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")

【讨论】:

  • 谢谢大家。这个真的很好用。我确实把它放到了一个新的数据表中,因为我的控制台上的 obs 数量达到了 3500。总而言之,12K obs 现已完成。简单!再次感谢!
  • 您能否为有帮助的答案投票并勾选正确的答案?谢谢
  • 不幸的是,我的代表不够强大,无法投票。也就是说,这个建议对我来说效果最好。第二个代码是我使用的那个,因为我想最终成对使用。
【解决方案2】:
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)

【讨论】:

  • 我的不是文本,而是导入到 R 的 csv 文件。使用此方法时出现此错误:Combn(x$AID, 2) 中的错误:n
  • 请使用 ?dput() 显示一个小示例数据(产生错误)
【解决方案3】:

这里的方法有点类似于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 输入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 2012-03-27
    • 2011-08-10
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    相关资源
    最近更新 更多