【问题标题】:Add rows with possible combinations in R dataframe在 R 数据框中添加具有可能组合的行
【发布时间】:2018-04-09 20:03:48
【问题描述】:

首先,请接受我对一个糟糕的标题的歉意——我相信会有更好的标题,但我缺乏正确的英语/数学术语来正确表达它。 我也很确定我的问题很简单,但由于一些基本的数学无知,我什至不知道如何调用一个像样的谷歌搜索。

我正在尝试在成对的列中查找所有可能的项目组合。

给定这样的数据框:

data.frame(obj1 = c("A", "B", "C", "D", "E", "F"),
           obj2 = c("B", "C", "D", "E", "F", "A"),
           obj3 = c("C", "D", "E", "F", "A", "B"),
           obj4 = c("D", "E", "F", "A", "B", "C"),
           obj5 = c("E", "F", "A", "B", "C", "D"),
           obj6 = c("F", "A", "B", "C", "D", "E"))

  obj1 obj2 obj3 obj4 obj5 obj6
1    A    B    C    D    E    F
2    B    C    D    E    F    A
3    C    D    E    F    A    B
4    D    E    F    A    B    C
5    E    F    A    B    C    D
6    F    A    B    C    D    E

我想以某种方式添加新行,即每对列 (obj1-obj2, obj1-obj3, obj1-obj4, ..., @ 987654336@-obj6) 出现所有项目组合。

例如:在第一列对中:obj1-obj2,项目 A 仅与项目 BF 一起出现。缺少其他项目级别组合,这就是我想要的。

注意事项
- 每个项目 (A,...,F) 在数据框的每一行中只能出现一次
- 相同的字母对(A-B 和 B-A)在一行中被视为重复,而不是在列中

实际上,我希望按行增长这个数据框,以便在选择随机的一对列时,会出现 6 个项目的每个组合。

我的直觉告诉我,我正在查看一个 90 x 6 大小的数据框,但这只是直觉,我无法输入公式并解释我是如何得出这个数字的 :)

如果我的问题不清楚,答案很明显或以任何其他方式违反任何规则,请告诉我,以便我尝试解释自己

编辑
收到所有的cmets后,我会尝试更清楚地解释自己。

考虑一下这个简单的实验条件表,我们称它为 table1 并将其视为一个对象间表:

在这种更简单的情况下,每个参与者将看到 6 对目标项目(A、B、C),这些目标项目以下列方式(table2)取自列 (col1, col2, col3) > - 在主题表中):

这 6 个试验保证每对中的每个参与者都存在目标项目的每个组合。

如果我以固定顺序(例如:快乐、悲伤、聪明、无聊、困惑、疲倦)为每个参与者呈现 6 个不同的特征(表 2 中的每个试验一个),则在 3 个参与者之后将呈现每个特征关于目标项目的每个组合。
对于参与者 1 - 特征快乐将呈现目标 A - B
对于参与者 2 - 特征快乐将与目标 B - C
一起呈现 对于参与者 3 - 特征快乐将呈现与目标 C - A
注意,一组(理论)B - A 将被视为重复。

我正在寻找一种将 table1 从上述 3 项示例扩展为 6 项 table1 的方法。 自然 table2 也会增长,但已经处理好了。 Table1 是导致我出现问题的原因。

这就是起点的样子

感谢您的帮助。 最好的问候。

【问题讨论】:

  • 我在发布之前发现了这个问题,但不知道如何使用提供的解决方案 - 特别是 - 如何处理重复项
  • 好的,再次阅读我认为您需要尝试更仔细地定义它,也许使用更少的字母/列,并准确描述哪些内容会重复,哪些不会重复。你说“当随机选择一对列时,会出现 6 个项目的每个组合。”因此,15 对列中的每一列都必须包含不同字母的 15 组合。这并不能真正说明重复是什么,因为一行是否有助于该条件取决于所有其他行!
  • 首先,这实际上不是 R 或任何其他语言的编程问题。我认为我理解你想要做什么,但这不是编程要为你解决的问题——你实际上需要通过组合来工作。 A B C D E FA B D E F C 是否都有效?正如我之前所理解的那样,它们将是两个有效的组合 - 但正如您现在所解释的那样,它们似乎可能不是。在组合数学方面,第一个位置有 6 个选项,第二个位置有 5 个选项 - 总共 30 个选项。其他任何事情都会重复。

标签: r combinatorics


【解决方案1】:

再看这个,考虑以下起始位置,可以用来生成6个组合,如Maurits Evers的回答所示。

A B C D E F
A C E B D F
A E D C B F
A D B E C F

这个家族是通过占据前一个位置的位置 1 3 5 2 4 6 生成的。加上所有的班次,这是 24 种不同的排序。

你可以用类似的方式再生成 24 个,从

开始
F E D C B A

我很确定我们可以得到另一个

A B C E F D

这可能意味着以下内容也不错:

A C F B E D
A F E C B D
A E B F C D

(同样适用于所有F -> A

那就是 96。我错过了任何一个还是重复了一个?

【讨论】:

  • (发布此内容后,我看到了您所关注的警告 - 我现在正在修改)
  • 梅丽莎,谢谢。如果您能找到有关警告的解决方案,那对我将有很大帮助。
  • 更新完成。在这一点上,这并不是一个真正的编程问题——我想出了 96 种组合,应该可以满足您的要求。我不知道是否还有其他人 - 我是系统性的,但这不是我的领域。
  • 哦,对不起。我看着手机里的答案。当我到达我的办公室时会仔细检查它。谢谢
  • 抱歉,但我在复制您所描述的逻辑时遇到了一些麻烦。你有没有机会让它更明确?如果可以的话,看看我的问题的编辑部分
【解决方案2】:

注意:我不确定你在追求什么。我的回答似乎没有解决您的问题,但是由于@MelissaKey 的回答中的引用,我将保留它。

  1. 定义一个移位函数,将数值向量的条目循环向左移动n

    shift <- function(x, n = 1) {
      if (n == 0) x else c(tail(x, -n), head(x, n))
    }
    
  2. 如果我们现在从一个初始向量 v 开始,它对应于您的预期输出的第一行 data.frame

    v <- c("A", "B", "C", "D", "E", "F")
    

    我们可以通过rbinding 连续转换v 的版本来重现您的预期输出

    do.call(rbind, lapply(0:(length(v) - 1), function(i) shift(v, i)))
    #    [,1] [,2] [,3] [,4] [,5] [,6]
    #[1,] "A"  "B"  "C"  "D"  "E"  "F"
    #[2,] "B"  "C"  "D"  "E"  "F"  "A"
    #[3,] "C"  "D"  "E"  "F"  "A"  "B"
    #[4,] "D"  "E"  "F"  "A"  "B"  "C"
    #[5,] "E"  "F"  "A"  "B"  "C"  "D"
    #[6,] "F"  "A"  "B"  "C"  "D"  "E"
    

这将适用于任何长度 k 的任何初始向量,生成维度为 k x k 的最终 matrix

【讨论】:

  • 这不是 OP 的预期输出
  • @Moody_Mudskipper 嗯。 data.frame 不是输出 OP 想要重建的吗?
  • 不是我理解的那样,OP 将此 df 作为起点,然后解释其中缺少的内容。
  • 正如 Moody_Mudskipper 所指出的,我想用后续的行来扩展这个示例。谢谢你的时间
猜你喜欢
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多