在R dataframe

时间:2018-04-09 20:03:49

标签: r combinatorics

首先,请接受我为一个糟糕的头衔道歉 - 我敢肯定会有更好的一个,但我缺乏正确的英语/数学术语,以正确的方式说出来。 我也很确定我的问题很容易,但由于一些基本的数学无知,我甚至不知道如何称呼一个像样的谷歌搜索。

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

给出这样的数据框:

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 - obj2obj1 - obj3obj1 - obj4,...,obj5 - obj6)所有项目组合都会显示。

例如:在第1列对中:obj1 - obj2,商品A仅显示商品BF。缺少其他项目级别组合,这就是我想要的。

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

实际上,我想逐行增长这个数据框,这样当选择一对随机列时,就会出现6个项目的每个组合。

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

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

修改
在收到所有评论后,我会尝试更清楚地解释自己。

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

enter image description here

在这个更简单的情况下,每个参与者将以下列方式呈现从列(col1,col2,col3)中取出的6对目标项目(A,B,C)( table2 - 在主题表内:

enter image description here

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

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

我正在寻找的方法是将 table1 从上面的3个项目示例扩展为6项 table1 。 当然, table2 也会增长,但是这一点已经得到了解决。 表1 是导致我出现问题的原因。

这就是起点的样子

enter image description here

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

2 个答案:

答案 0 :(得分: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.我错过了任何一个或重复吗?

答案 1 :(得分:1)

注意:我不确定你追求的是什么。我的回答似乎没有解决你的问题,但是由于在@ 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")
    

    我们可以通过rbind连续移位的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"
    
  3. 这适用于任何长度为k的任何初始向量,从而产生维度matrix的最终k x k